From 8e4bff4cab0ddac6060645b0715210484d02ff40 Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Wed, 30 Aug 2017 08:25:59 +0000 Subject: Initial file dump from open source release --- tools/Makefile | 91 + tools/cgroup/.gitignore | 1 + tools/cgroup/Makefile | 11 + tools/cgroup/cgroup_event_listener.c | 82 + tools/firewire/Makefile | 19 + tools/firewire/decode-fcp.c | 213 + tools/firewire/list.h | 62 + tools/firewire/nosy-dump.c | 1035 + tools/firewire/nosy-dump.h | 173 + tools/gator/daemon/Android.mk | 76 + tools/gator/daemon/AnnotateListener.cpp | 69 + tools/gator/daemon/AnnotateListener.h | 31 + tools/gator/daemon/Application.mk | 3 + tools/gator/daemon/Buffer.cpp | 428 + tools/gator/daemon/Buffer.h | 106 + tools/gator/daemon/CCNDriver.cpp | 295 + tools/gator/daemon/CCNDriver.h | 43 + tools/gator/daemon/CPUFreqDriver.cpp | 58 + tools/gator/daemon/CPUFreqDriver.h | 34 + tools/gator/daemon/CapturedXML.cpp | 145 + tools/gator/daemon/CapturedXML.h | 26 + tools/gator/daemon/Child.cpp | 392 + tools/gator/daemon/Child.h | 33 + tools/gator/daemon/Command.cpp | 172 + tools/gator/daemon/Command.h | 14 + tools/gator/daemon/Config.h | 28 + tools/gator/daemon/ConfigurationXML.cpp | 217 + tools/gator/daemon/ConfigurationXML.h | 38 + tools/gator/daemon/Counter.h | 65 + tools/gator/daemon/DiskIODriver.cpp | 125 + tools/gator/daemon/DiskIODriver.h | 39 + tools/gator/daemon/Driver.cpp | 96 + tools/gator/daemon/Driver.h | 118 + tools/gator/daemon/DriverSource.cpp | 322 + tools/gator/daemon/DriverSource.h | 57 + tools/gator/daemon/DynBuf.cpp | 139 + tools/gator/daemon/DynBuf.h | 52 + tools/gator/daemon/EventsXML.cpp | 76 + tools/gator/daemon/EventsXML.h | 21 + tools/gator/daemon/ExternalSource.cpp | 260 + tools/gator/daemon/ExternalSource.h | 53 + tools/gator/daemon/FSDriver.cpp | 158 + tools/gator/daemon/FSDriver.h | 29 + tools/gator/daemon/Fifo.cpp | 127 + tools/gator/daemon/Fifo.h | 48 + tools/gator/daemon/FtraceDriver.cpp | 118 + tools/gator/daemon/FtraceDriver.h | 31 + tools/gator/daemon/FtraceSource.cpp | 158 + tools/gator/daemon/FtraceSource.h | 43 + tools/gator/daemon/HwmonDriver.cpp | 245 + tools/gator/daemon/HwmonDriver.h | 31 + tools/gator/daemon/KMod.cpp | 119 + tools/gator/daemon/KMod.h | 32 + tools/gator/daemon/LocalCapture.cpp | 131 + tools/gator/daemon/LocalCapture.h | 26 + tools/gator/daemon/Logging.cpp | 78 + tools/gator/daemon/Logging.h | 36 + tools/gator/daemon/Makefile | 22 + tools/gator/daemon/Makefile_aarch64 | 12 + tools/gator/daemon/MaliVideoDriver.cpp | 191 + tools/gator/daemon/MaliVideoDriver.h | 45 + tools/gator/daemon/MemInfoDriver.cpp | 93 + tools/gator/daemon/MemInfoDriver.h | 37 + tools/gator/daemon/Monitor.cpp | 82 + tools/gator/daemon/Monitor.h | 33 + tools/gator/daemon/NetDriver.cpp | 129 + tools/gator/daemon/NetDriver.h | 39 + tools/gator/daemon/OlySocket.cpp | 324 + tools/gator/daemon/OlySocket.h | 64 + tools/gator/daemon/OlyUtility.cpp | 227 + tools/gator/daemon/OlyUtility.h | 42 + tools/gator/daemon/PerfBuffer.cpp | 158 + tools/gator/daemon/PerfBuffer.h | 41 + tools/gator/daemon/PerfDriver.cpp | 351 + tools/gator/daemon/PerfDriver.h | 57 + tools/gator/daemon/PerfGroup.cpp | 244 + tools/gator/daemon/PerfGroup.h | 65 + tools/gator/daemon/PerfSource.cpp | 449 + tools/gator/daemon/PerfSource.h | 55 + tools/gator/daemon/Proc.cpp | 312 + tools/gator/daemon/Proc.h | 21 + tools/gator/daemon/Sender.cpp | 129 + tools/gator/daemon/Sender.h | 42 + tools/gator/daemon/SessionData.cpp | 261 + tools/gator/daemon/SessionData.h | 102 + tools/gator/daemon/SessionXML.cpp | 111 + tools/gator/daemon/SessionXML.h | 42 + tools/gator/daemon/Setup.cpp | 232 + tools/gator/daemon/Setup.h | 18 + tools/gator/daemon/Source.cpp | 33 + tools/gator/daemon/Source.h | 40 + tools/gator/daemon/StreamlineSetup.cpp | 272 + tools/gator/daemon/StreamlineSetup.h | 50 + tools/gator/daemon/UEvent.cpp | 77 + tools/gator/daemon/UEvent.h | 36 + tools/gator/daemon/UserSpaceSource.cpp | 94 + tools/gator/daemon/UserSpaceSource.h | 38 + tools/gator/daemon/c++.cpp | 40 + tools/gator/daemon/common.mk | 52 + tools/gator/daemon/defaults.xml | 84 + tools/gator/daemon/defaults_xml.h | 407 + tools/gator/daemon/escape | Bin 0 -> 8900 bytes tools/gator/daemon/escape.c | 75 + tools/gator/daemon/events-ARM11.xml | 39 + tools/gator/daemon/events-ARM11MPCore.xml | 26 + tools/gator/daemon/events-CCI-400.xml | 98 + tools/gator/daemon/events-CCN-504.xml | 113 + tools/gator/daemon/events-Cortex-A15.xml | 68 + tools/gator/daemon/events-Cortex-A17.xml | 86 + tools/gator/daemon/events-Cortex-A5.xml | 36 + tools/gator/daemon/events-Cortex-A53.xml | 87 + tools/gator/daemon/events-Cortex-A57.xml | 87 + tools/gator/daemon/events-Cortex-A7.xml | 43 + tools/gator/daemon/events-Cortex-A8.xml | 52 + tools/gator/daemon/events-Cortex-A9.xml | 65 + tools/gator/daemon/events-Filesystem.xml | 11 + tools/gator/daemon/events-Krait-architected.xml | 22 + tools/gator/daemon/events-L2C-310.xml | 18 + tools/gator/daemon/events-Linux.xml | 17 + tools/gator/daemon/events-Mali-4xx.xml | 245 + tools/gator/daemon/events-Mali-Midgard.xml | 46 + tools/gator/daemon/events-Mali-Midgard_hw.xml | 91 + tools/gator/daemon/events-Mali-T60x_hw.xml | 108 + tools/gator/daemon/events-Mali-T62x_hw.xml | 109 + tools/gator/daemon/events-Mali-T72x_hw.xml | 95 + tools/gator/daemon/events-Mali-T76x_hw.xml | 108 + tools/gator/daemon/events-Mali-V500.xml | 30 + tools/gator/daemon/events-Perf-Hardware.xml | 12 + tools/gator/daemon/events-Scorpion.xml | 107 + tools/gator/daemon/events-ScorpionMP.xml | 90 + tools/gator/daemon/events-ftrace.xml | 7 + tools/gator/daemon/events.xml | 1919 ++ tools/gator/daemon/events_footer.xml | 1 + tools/gator/daemon/events_header.xml | 2 + tools/gator/daemon/events_xml.h | 20025 +++++++++++++++++++ tools/gator/daemon/k/perf_event.3.12.h | 792 + tools/gator/daemon/k/perf_event.h | 1 + tools/gator/daemon/libsensors/COPYING.LGPL | 502 + tools/gator/daemon/libsensors/access.c | 561 + tools/gator/daemon/libsensors/access.h | 33 + tools/gator/daemon/libsensors/conf-lex.c | 2881 +++ tools/gator/daemon/libsensors/conf-lex.l | 372 + tools/gator/daemon/libsensors/conf-parse.c | 2042 ++ tools/gator/daemon/libsensors/conf-parse.h | 84 + tools/gator/daemon/libsensors/conf-parse.y | 347 + tools/gator/daemon/libsensors/conf.h | 34 + tools/gator/daemon/libsensors/data.c | 278 + tools/gator/daemon/libsensors/data.h | 184 + tools/gator/daemon/libsensors/error.c | 92 + tools/gator/daemon/libsensors/error.h | 74 + tools/gator/daemon/libsensors/general.c | 85 + tools/gator/daemon/libsensors/general.h | 39 + tools/gator/daemon/libsensors/init.c | 341 + tools/gator/daemon/libsensors/init.h | 28 + tools/gator/daemon/libsensors/scanner.h | 32 + tools/gator/daemon/libsensors/sensors.h | 311 + tools/gator/daemon/libsensors/sysfs.c | 926 + tools/gator/daemon/libsensors/sysfs.h | 43 + tools/gator/daemon/libsensors/version.h | 1 + tools/gator/daemon/main.cpp | 584 + tools/gator/daemon/mxml/COPYING | 507 + tools/gator/daemon/mxml/config.h | 96 + tools/gator/daemon/mxml/mxml-attr.c | 314 + tools/gator/daemon/mxml/mxml-entity.c | 449 + tools/gator/daemon/mxml/mxml-file.c | 3056 +++ tools/gator/daemon/mxml/mxml-get.c | 452 + tools/gator/daemon/mxml/mxml-index.c | 659 + tools/gator/daemon/mxml/mxml-node.c | 788 + tools/gator/daemon/mxml/mxml-private.c | 323 + tools/gator/daemon/mxml/mxml-private.h | 50 + tools/gator/daemon/mxml/mxml-search.c | 280 + tools/gator/daemon/mxml/mxml-set.c | 337 + tools/gator/daemon/mxml/mxml-string.c | 469 + tools/gator/daemon/mxml/mxml.h | 332 + tools/hv/hv_get_dhcp_info.sh | 28 + tools/hv/hv_get_dns_info.sh | 13 + tools/hv/hv_kvp_daemon.c | 1704 ++ tools/hv/hv_set_ifconfig.sh | 64 + tools/hv/hv_vss_daemon.c | 249 + tools/include/tools/be_byteshift.h | 70 + tools/include/tools/le_byteshift.h | 70 + tools/lguest/.gitignore | 1 + tools/lguest/Makefile | 8 + tools/lguest/extract | 58 + tools/lguest/lguest.c | 2052 ++ tools/lguest/lguest.txt | 125 + tools/lib/lk/Makefile | 38 + tools/lib/lk/debugfs.c | 100 + tools/lib/lk/debugfs.h | 29 + tools/lib/traceevent/.gitignore | 1 + tools/lib/traceevent/Makefile | 319 + tools/lib/traceevent/event-parse.c | 5654 ++++++ tools/lib/traceevent/event-parse.h | 844 + tools/lib/traceevent/event-utils.h | 85 + tools/lib/traceevent/parse-filter.c | 2303 +++ tools/lib/traceevent/parse-utils.c | 129 + tools/lib/traceevent/trace-seq.c | 199 + tools/net/Makefile | 15 + tools/net/bpf_jit_disasm.c | 199 + tools/nfsd/inject_fault.sh | 49 + tools/perf/.gitignore | 25 + tools/perf/CREDITS | 30 + tools/perf/Documentation/Makefile | 352 + tools/perf/Documentation/android.txt | 78 + tools/perf/Documentation/asciidoc.conf | 91 + tools/perf/Documentation/examples.txt | 225 + tools/perf/Documentation/jit-interface.txt | 15 + tools/perf/Documentation/manpage-1.72.xsl | 14 + tools/perf/Documentation/manpage-base.xsl | 35 + tools/perf/Documentation/manpage-bold-literal.xsl | 17 + tools/perf/Documentation/manpage-normal.xsl | 13 + tools/perf/Documentation/manpage-suppress-sp.xsl | 21 + tools/perf/Documentation/perf-annotate.txt | 101 + tools/perf/Documentation/perf-archive.txt | 22 + tools/perf/Documentation/perf-bench.txt | 192 + tools/perf/Documentation/perf-buildid-cache.txt | 40 + tools/perf/Documentation/perf-buildid-list.txt | 43 + tools/perf/Documentation/perf-diff.txt | 133 + tools/perf/Documentation/perf-evlist.txt | 38 + tools/perf/Documentation/perf-help.txt | 38 + tools/perf/Documentation/perf-inject.txt | 46 + tools/perf/Documentation/perf-kmem.txt | 47 + tools/perf/Documentation/perf-kvm.txt | 100 + tools/perf/Documentation/perf-list.txt | 118 + tools/perf/Documentation/perf-lock.txt | 66 + tools/perf/Documentation/perf-mem.txt | 48 + tools/perf/Documentation/perf-probe.txt | 205 + tools/perf/Documentation/perf-record.txt | 193 + tools/perf/Documentation/perf-report.txt | 215 + tools/perf/Documentation/perf-sched.txt | 55 + tools/perf/Documentation/perf-script-perl.txt | 216 + tools/perf/Documentation/perf-script-python.txt | 620 + tools/perf/Documentation/perf-script.txt | 209 + tools/perf/Documentation/perf-stat.txt | 155 + tools/perf/Documentation/perf-test.txt | 32 + tools/perf/Documentation/perf-timechart.txt | 46 + tools/perf/Documentation/perf-top.txt | 193 + tools/perf/Documentation/perf-trace.txt | 59 + tools/perf/Documentation/perf.txt | 24 + tools/perf/Documentation/perfconfig.example | 29 + tools/perf/MANIFEST | 32 + tools/perf/Makefile | 1217 ++ tools/perf/arch/arm/Makefile | 4 + tools/perf/arch/arm/util/dwarf-regs.c | 64 + tools/perf/arch/common.c | 212 + tools/perf/arch/common.h | 10 + tools/perf/arch/powerpc/Makefile | 5 + tools/perf/arch/powerpc/util/dwarf-regs.c | 88 + tools/perf/arch/powerpc/util/header.c | 36 + tools/perf/arch/s390/Makefile | 4 + tools/perf/arch/s390/util/dwarf-regs.c | 22 + tools/perf/arch/sh/Makefile | 4 + tools/perf/arch/sh/util/dwarf-regs.c | 55 + tools/perf/arch/sparc/Makefile | 4 + tools/perf/arch/sparc/util/dwarf-regs.c | 43 + tools/perf/arch/x86/Makefile | 8 + tools/perf/arch/x86/include/perf_regs.h | 80 + tools/perf/arch/x86/util/dwarf-regs.c | 75 + tools/perf/arch/x86/util/header.c | 59 + tools/perf/arch/x86/util/unwind.c | 111 + tools/perf/bash_completion | 62 + tools/perf/bench/bench.h | 44 + tools/perf/bench/mem-memcpy-arch.h | 12 + tools/perf/bench/mem-memcpy-x86-64-asm-def.h | 12 + tools/perf/bench/mem-memcpy-x86-64-asm.S | 12 + tools/perf/bench/mem-memcpy.c | 303 + tools/perf/bench/mem-memset-arch.h | 12 + tools/perf/bench/mem-memset-x86-64-asm-def.h | 12 + tools/perf/bench/mem-memset-x86-64-asm.S | 13 + tools/perf/bench/mem-memset.c | 297 + tools/perf/bench/numa.c | 1731 ++ tools/perf/bench/sched-messaging.c | 336 + tools/perf/bench/sched-pipe.c | 127 + tools/perf/builtin-annotate.c | 359 + tools/perf/builtin-bench.c | 267 + tools/perf/builtin-buildid-cache.c | 221 + tools/perf/builtin-buildid-list.c | 106 + tools/perf/builtin-diff.c | 619 + tools/perf/builtin-evlist.c | 61 + tools/perf/builtin-help.c | 479 + tools/perf/builtin-inject.c | 461 + tools/perf/builtin-kmem.c | 781 + tools/perf/builtin-kvm.c | 1047 + tools/perf/builtin-list.c | 62 + tools/perf/builtin-lock.c | 997 + tools/perf/builtin-mem.c | 242 + tools/perf/builtin-probe.c | 470 + tools/perf/builtin-record.c | 1070 + tools/perf/builtin-report.c | 962 + tools/perf/builtin-sched.c | 1785 ++ tools/perf/builtin-script.c | 1542 ++ tools/perf/builtin-stat.c | 1552 ++ tools/perf/builtin-timechart.c | 1095 + tools/perf/builtin-top.c | 1231 ++ tools/perf/builtin-trace.c | 685 + tools/perf/builtin.h | 42 + tools/perf/command-list.txt | 27 + tools/perf/config/feature-tests.mak | 236 + tools/perf/config/utilities.mak | 194 + tools/perf/design.txt | 463 + tools/perf/perf-archive.sh | 47 + tools/perf/perf.c | 543 + tools/perf/perf.h | 233 + tools/perf/python/twatch.py | 41 + tools/perf/scripts/perl/Perf-Trace-Util/Context.c | 135 + tools/perf/scripts/perl/Perf-Trace-Util/Context.xs | 42 + .../perf/scripts/perl/Perf-Trace-Util/Makefile.PL | 17 + tools/perf/scripts/perl/Perf-Trace-Util/README | 59 + .../perl/Perf-Trace-Util/lib/Perf/Trace/Context.pm | 55 + .../perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm | 192 + .../perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm | 94 + tools/perf/scripts/perl/Perf-Trace-Util/typemap | 1 + .../perf/scripts/perl/bin/check-perf-trace-record | 2 + tools/perf/scripts/perl/bin/failed-syscalls-record | 2 + tools/perf/scripts/perl/bin/failed-syscalls-report | 10 + tools/perf/scripts/perl/bin/rw-by-file-record | 3 + tools/perf/scripts/perl/bin/rw-by-file-report | 10 + tools/perf/scripts/perl/bin/rw-by-pid-record | 2 + tools/perf/scripts/perl/bin/rw-by-pid-report | 3 + tools/perf/scripts/perl/bin/rwtop-record | 2 + tools/perf/scripts/perl/bin/rwtop-report | 20 + tools/perf/scripts/perl/bin/wakeup-latency-record | 6 + tools/perf/scripts/perl/bin/wakeup-latency-report | 3 + tools/perf/scripts/perl/check-perf-trace.pl | 106 + tools/perf/scripts/perl/failed-syscalls.pl | 42 + tools/perf/scripts/perl/rw-by-file.pl | 106 + tools/perf/scripts/perl/rw-by-pid.pl | 184 + tools/perf/scripts/perl/rwtop.pl | 203 + tools/perf/scripts/perl/wakeup-latency.pl | 107 + .../perf/scripts/python/Perf-Trace-Util/Context.c | 88 + .../python/Perf-Trace-Util/lib/Perf/Trace/Core.py | 121 + .../Perf-Trace-Util/lib/Perf/Trace/EventClass.py | 94 + .../Perf-Trace-Util/lib/Perf/Trace/SchedGui.py | 184 + .../python/Perf-Trace-Util/lib/Perf/Trace/Util.py | 86 + .../python/bin/event_analyzing_sample-record | 8 + .../python/bin/event_analyzing_sample-report | 3 + .../python/bin/failed-syscalls-by-pid-record | 2 + .../python/bin/failed-syscalls-by-pid-report | 10 + .../scripts/python/bin/futex-contention-record | 2 + .../scripts/python/bin/futex-contention-report | 4 + .../perf/scripts/python/bin/net_dropmonitor-record | 2 + .../perf/scripts/python/bin/net_dropmonitor-report | 4 + tools/perf/scripts/python/bin/netdev-times-record | 8 + tools/perf/scripts/python/bin/netdev-times-report | 5 + .../perf/scripts/python/bin/sched-migration-record | 2 + .../perf/scripts/python/bin/sched-migration-report | 3 + tools/perf/scripts/python/bin/sctop-record | 2 + tools/perf/scripts/python/bin/sctop-report | 24 + .../python/bin/syscall-counts-by-pid-record | 2 + .../python/bin/syscall-counts-by-pid-report | 10 + .../perf/scripts/python/bin/syscall-counts-record | 2 + .../perf/scripts/python/bin/syscall-counts-report | 10 + tools/perf/scripts/python/check-perf-trace.py | 82 + .../perf/scripts/python/event_analyzing_sample.py | 189 + .../perf/scripts/python/failed-syscalls-by-pid.py | 73 + tools/perf/scripts/python/futex-contention.py | 50 + tools/perf/scripts/python/net_dropmonitor.py | 75 + tools/perf/scripts/python/netdev-times.py | 464 + tools/perf/scripts/python/sched-migration.py | 461 + tools/perf/scripts/python/sctop.py | 75 + tools/perf/scripts/python/syscall-counts-by-pid.py | 69 + tools/perf/scripts/python/syscall-counts.py | 59 + tools/perf/tests/attr.c | 183 + tools/perf/tests/attr.py | 332 + tools/perf/tests/attr/README | 64 + tools/perf/tests/attr/base-record | 40 + tools/perf/tests/attr/base-stat | 40 + tools/perf/tests/attr/test-record-C0 | 13 + tools/perf/tests/attr/test-record-basic | 5 + tools/perf/tests/attr/test-record-branch-any | 8 + .../perf/tests/attr/test-record-branch-filter-any | 8 + .../tests/attr/test-record-branch-filter-any_call | 8 + .../tests/attr/test-record-branch-filter-any_ret | 8 + tools/perf/tests/attr/test-record-branch-filter-hv | 8 + .../tests/attr/test-record-branch-filter-ind_call | 8 + tools/perf/tests/attr/test-record-branch-filter-k | 8 + tools/perf/tests/attr/test-record-branch-filter-u | 8 + tools/perf/tests/attr/test-record-count | 8 + tools/perf/tests/attr/test-record-data | 8 + tools/perf/tests/attr/test-record-freq | 6 + tools/perf/tests/attr/test-record-graph-default | 6 + tools/perf/tests/attr/test-record-graph-dwarf | 10 + tools/perf/tests/attr/test-record-graph-fp | 6 + tools/perf/tests/attr/test-record-group | 20 + tools/perf/tests/attr/test-record-group1 | 21 + tools/perf/tests/attr/test-record-no-delay | 9 + tools/perf/tests/attr/test-record-no-inherit | 7 + tools/perf/tests/attr/test-record-no-samples | 6 + tools/perf/tests/attr/test-record-period | 7 + tools/perf/tests/attr/test-record-raw | 7 + tools/perf/tests/attr/test-stat-C0 | 9 + tools/perf/tests/attr/test-stat-basic | 6 + tools/perf/tests/attr/test-stat-default | 64 + tools/perf/tests/attr/test-stat-detailed-1 | 101 + tools/perf/tests/attr/test-stat-detailed-2 | 155 + tools/perf/tests/attr/test-stat-detailed-3 | 173 + tools/perf/tests/attr/test-stat-group | 15 + tools/perf/tests/attr/test-stat-group1 | 15 + tools/perf/tests/attr/test-stat-no-inherit | 7 + tools/perf/tests/bp_signal.c | 186 + tools/perf/tests/bp_signal_overflow.c | 126 + tools/perf/tests/builtin-test.c | 219 + tools/perf/tests/dso-data.c | 159 + tools/perf/tests/evsel-roundtrip-name.c | 114 + tools/perf/tests/evsel-tp-sched.c | 84 + tools/perf/tests/hists_link.c | 500 + tools/perf/tests/mmap-basic.c | 150 + tools/perf/tests/open-syscall-all-cpus.c | 109 + tools/perf/tests/open-syscall-tp-fields.c | 121 + tools/perf/tests/open-syscall.c | 55 + tools/perf/tests/parse-events.c | 1383 ++ tools/perf/tests/perf-record.c | 317 + tools/perf/tests/pmu.c | 173 + tools/perf/tests/python-use.c | 23 + tools/perf/tests/rdpmc.c | 175 + tools/perf/tests/sw-clock.c | 119 + tools/perf/tests/task-exit.c | 123 + tools/perf/tests/tests.h | 31 + tools/perf/tests/vmlinux-kallsyms.c | 233 + tools/perf/ui/browser.c | 721 + tools/perf/ui/browser.h | 74 + tools/perf/ui/browsers/annotate.c | 1009 + tools/perf/ui/browsers/hists.c | 1905 ++ tools/perf/ui/browsers/map.c | 130 + tools/perf/ui/browsers/map.h | 6 + tools/perf/ui/browsers/scripts.c | 188 + tools/perf/ui/gtk/annotate.c | 245 + tools/perf/ui/gtk/browser.c | 87 + tools/perf/ui/gtk/gtk.h | 51 + tools/perf/ui/gtk/helpline.c | 57 + tools/perf/ui/gtk/hists.c | 309 + tools/perf/ui/gtk/progress.c | 59 + tools/perf/ui/gtk/setup.c | 23 + tools/perf/ui/gtk/util.c | 113 + tools/perf/ui/helpline.c | 73 + tools/perf/ui/helpline.h | 29 + tools/perf/ui/hist.c | 513 + tools/perf/ui/keysyms.h | 28 + tools/perf/ui/libslang.h | 29 + tools/perf/ui/progress.c | 26 + tools/perf/ui/progress.h | 18 + tools/perf/ui/setup.c | 53 + tools/perf/ui/stdio/hist.c | 484 + tools/perf/ui/tui/helpline.c | 58 + tools/perf/ui/tui/progress.c | 42 + tools/perf/ui/tui/setup.c | 150 + tools/perf/ui/tui/util.c | 243 + tools/perf/ui/ui.h | 39 + tools/perf/ui/util.c | 84 + tools/perf/ui/util.h | 21 + tools/perf/util/PERF-VERSION-GEN | 38 + tools/perf/util/abspath.c | 37 + tools/perf/util/alias.c | 78 + tools/perf/util/annotate.c | 1330 ++ tools/perf/util/annotate.h | 194 + tools/perf/util/bitmap.c | 31 + tools/perf/util/build-id.c | 104 + tools/perf/util/build-id.h | 19 + tools/perf/util/cache.h | 77 + tools/perf/util/callchain.c | 463 + tools/perf/util/callchain.h | 151 + tools/perf/util/cgroup.c | 177 + tools/perf/util/cgroup.h | 17 + tools/perf/util/color.c | 332 + tools/perf/util/color.h | 46 + tools/perf/util/config.c | 509 + tools/perf/util/cpumap.c | 319 + tools/perf/util/cpumap.h | 49 + tools/perf/util/ctype.c | 39 + tools/perf/util/debug.c | 84 + tools/perf/util/debug.h | 20 + tools/perf/util/dso.c | 595 + tools/perf/util/dso.h | 148 + tools/perf/util/dwarf-aux.c | 845 + tools/perf/util/dwarf-aux.h | 111 + tools/perf/util/environment.c | 9 + tools/perf/util/event.c | 733 + tools/perf/util/event.h | 233 + tools/perf/util/evlist.c | 865 + tools/perf/util/evlist.h | 167 + tools/perf/util/evsel.c | 1557 ++ tools/perf/util/evsel.h | 304 + tools/perf/util/exec_cmd.c | 148 + tools/perf/util/exec_cmd.h | 12 + tools/perf/util/generate-cmdlist.sh | 39 + tools/perf/util/header.c | 3158 +++ tools/perf/util/header.h | 166 + tools/perf/util/help.c | 340 + tools/perf/util/help.h | 29 + tools/perf/util/hist.c | 1008 + tools/perf/util/hist.h | 256 + tools/perf/util/hweight.c | 31 + tools/perf/util/include/asm/alternative-asm.h | 8 + tools/perf/util/include/asm/asm-offsets.h | 1 + tools/perf/util/include/asm/bug.h | 22 + tools/perf/util/include/asm/byteorder.h | 2 + tools/perf/util/include/asm/cpufeature.h | 9 + tools/perf/util/include/asm/dwarf2.h | 13 + tools/perf/util/include/asm/hweight.h | 8 + tools/perf/util/include/asm/swab.h | 1 + tools/perf/util/include/asm/system.h | 1 + tools/perf/util/include/asm/uaccess.h | 14 + tools/perf/util/include/asm/unistd_32.h | 1 + tools/perf/util/include/asm/unistd_64.h | 1 + tools/perf/util/include/dwarf-regs.h | 8 + tools/perf/util/include/linux/bitmap.h | 46 + tools/perf/util/include/linux/bitops.h | 158 + tools/perf/util/include/linux/compiler.h | 21 + tools/perf/util/include/linux/const.h | 1 + tools/perf/util/include/linux/ctype.h | 1 + tools/perf/util/include/linux/export.h | 6 + tools/perf/util/include/linux/hash.h | 5 + tools/perf/util/include/linux/kernel.h | 134 + tools/perf/util/include/linux/linkage.h | 13 + tools/perf/util/include/linux/list.h | 29 + tools/perf/util/include/linux/magic.h | 12 + tools/perf/util/include/linux/poison.h | 1 + tools/perf/util/include/linux/prefetch.h | 6 + tools/perf/util/include/linux/rbtree.h | 2 + tools/perf/util/include/linux/rbtree_augmented.h | 2 + tools/perf/util/include/linux/string.h | 3 + tools/perf/util/include/linux/types.h | 29 + tools/perf/util/intlist.c | 131 + tools/perf/util/intlist.h | 75 + tools/perf/util/levenshtein.c | 84 + tools/perf/util/levenshtein.h | 8 + tools/perf/util/machine.c | 1266 ++ tools/perf/util/machine.h | 159 + tools/perf/util/map.c | 588 + tools/perf/util/map.h | 169 + tools/perf/util/pager.c | 100 + tools/perf/util/parse-events.c | 1240 ++ tools/perf/util/parse-events.h | 112 + tools/perf/util/parse-events.l | 215 + tools/perf/util/parse-events.y | 424 + tools/perf/util/parse-options.c | 589 + tools/perf/util/parse-options.h | 193 + tools/perf/util/path.c | 157 + tools/perf/util/perf_regs.h | 14 + tools/perf/util/pmu.c | 566 + tools/perf/util/pmu.h | 44 + tools/perf/util/pmu.l | 43 + tools/perf/util/pmu.y | 92 + tools/perf/util/probe-event.c | 2374 +++ tools/perf/util/probe-event.h | 140 + tools/perf/util/probe-finder.c | 1588 ++ tools/perf/util/probe-finder.h | 107 + tools/perf/util/pstack.c | 75 + tools/perf/util/pstack.h | 14 + tools/perf/util/python-ext-sources | 21 + tools/perf/util/python.c | 1056 + tools/perf/util/quote.c | 54 + tools/perf/util/quote.h | 29 + tools/perf/util/rblist.c | 107 + tools/perf/util/rblist.h | 47 + tools/perf/util/run-command.c | 214 + tools/perf/util/run-command.h | 58 + .../perf/util/scripting-engines/trace-event-perl.c | 643 + .../util/scripting-engines/trace-event-python.c | 694 + tools/perf/util/session.c | 1567 ++ tools/perf/util/session.h | 118 + tools/perf/util/setup.py | 47 + tools/perf/util/sigchain.c | 52 + tools/perf/util/sigchain.h | 10 + tools/perf/util/sort.c | 1005 + tools/perf/util/sort.h | 178 + tools/perf/util/stat.c | 57 + tools/perf/util/stat.h | 16 + tools/perf/util/strbuf.c | 134 + tools/perf/util/strbuf.h | 92 + tools/perf/util/strfilter.c | 199 + tools/perf/util/strfilter.h | 48 + tools/perf/util/string.c | 389 + tools/perf/util/strlist.c | 172 + tools/perf/util/strlist.h | 79 + tools/perf/util/svghelper.c | 501 + tools/perf/util/svghelper.h | 28 + tools/perf/util/symbol-elf.c | 852 + tools/perf/util/symbol-minimal.c | 306 + tools/perf/util/symbol.c | 1269 ++ tools/perf/util/symbol.h | 250 + tools/perf/util/sysfs.c | 60 + tools/perf/util/sysfs.h | 6 + tools/perf/util/target.c | 151 + tools/perf/util/target.h | 65 + tools/perf/util/thread.c | 86 + tools/perf/util/thread.h | 49 + tools/perf/util/thread_map.c | 296 + tools/perf/util/thread_map.h | 29 + tools/perf/util/tool.h | 50 + tools/perf/util/top.c | 106 + tools/perf/util/top.h | 44 + tools/perf/util/trace-event-info.c | 648 + tools/perf/util/trace-event-parse.c | 317 + tools/perf/util/trace-event-read.c | 432 + tools/perf/util/trace-event-scripting.c | 171 + tools/perf/util/trace-event.h | 104 + tools/perf/util/types.h | 24 + tools/perf/util/unwind.c | 571 + tools/perf/util/unwind.h | 35 + tools/perf/util/usage.c | 84 + tools/perf/util/util.c | 271 + tools/perf/util/util.h | 279 + tools/perf/util/values.c | 232 + tools/perf/util/values.h | 27 + tools/perf/util/vdso.c | 111 + tools/perf/util/vdso.h | 18 + tools/perf/util/wrapper.c | 41 + tools/perf/util/xyarray.c | 20 + tools/perf/util/xyarray.h | 20 + tools/power/acpi/Makefile | 18 + tools/power/acpi/acpidump.8 | 59 + tools/power/acpi/acpidump.c | 559 + tools/power/cpupower/.gitignore | 29 + tools/power/cpupower/Makefile | 302 + tools/power/cpupower/README | 49 + tools/power/cpupower/ToDo | 11 + tools/power/cpupower/bench/Makefile | 36 + tools/power/cpupower/bench/README-BENCH | 124 + tools/power/cpupower/bench/benchmark.c | 194 + tools/power/cpupower/bench/benchmark.h | 29 + tools/power/cpupower/bench/config.h | 36 + tools/power/cpupower/bench/cpufreq-bench_plot.sh | 104 + tools/power/cpupower/bench/cpufreq-bench_script.sh | 101 + tools/power/cpupower/bench/example.cfg | 11 + tools/power/cpupower/bench/main.c | 202 + tools/power/cpupower/bench/parse.c | 225 + tools/power/cpupower/bench/parse.h | 53 + tools/power/cpupower/bench/system.c | 191 + tools/power/cpupower/bench/system.h | 29 + tools/power/cpupower/debug/i386/Makefile | 41 + tools/power/cpupower/debug/i386/centrino-decode.c | 113 + tools/power/cpupower/debug/i386/dump_psb.c | 196 + tools/power/cpupower/debug/i386/intel_gsic.c | 78 + .../power/cpupower/debug/i386/powernow-k8-decode.c | 96 + tools/power/cpupower/debug/kernel/Makefile | 23 + .../power/cpupower/debug/kernel/cpufreq-test_tsc.c | 113 + tools/power/cpupower/debug/x86_64/Makefile | 30 + tools/power/cpupower/lib/cpufreq.c | 208 + tools/power/cpupower/lib/cpufreq.h | 223 + tools/power/cpupower/lib/sysfs.c | 672 + tools/power/cpupower/lib/sysfs.h | 31 + tools/power/cpupower/man/cpupower-frequency-info.1 | 74 + tools/power/cpupower/man/cpupower-frequency-set.1 | 52 + tools/power/cpupower/man/cpupower-idle-info.1 | 90 + tools/power/cpupower/man/cpupower-info.1 | 19 + tools/power/cpupower/man/cpupower-monitor.1 | 190 + tools/power/cpupower/man/cpupower-set.1 | 94 + tools/power/cpupower/man/cpupower.1 | 72 + tools/power/cpupower/po/cs.po | 944 + tools/power/cpupower/po/de.po | 961 + tools/power/cpupower/po/fr.po | 947 + tools/power/cpupower/po/it.po | 961 + tools/power/cpupower/po/pt.po | 957 + tools/power/cpupower/utils/builtin.h | 11 + tools/power/cpupower/utils/cpufreq-info.c | 668 + tools/power/cpupower/utils/cpufreq-set.c | 331 + tools/power/cpupower/utils/cpuidle-info.c | 214 + tools/power/cpupower/utils/cpupower-info.c | 135 + tools/power/cpupower/utils/cpupower-set.c | 134 + tools/power/cpupower/utils/cpupower.c | 214 + tools/power/cpupower/utils/helpers/amd.c | 135 + tools/power/cpupower/utils/helpers/bitmask.c | 292 + tools/power/cpupower/utils/helpers/bitmask.h | 33 + tools/power/cpupower/utils/helpers/cpuid.c | 178 + tools/power/cpupower/utils/helpers/helpers.h | 195 + tools/power/cpupower/utils/helpers/misc.c | 27 + tools/power/cpupower/utils/helpers/msr.c | 115 + tools/power/cpupower/utils/helpers/pci.c | 55 + tools/power/cpupower/utils/helpers/sysfs.c | 358 + tools/power/cpupower/utils/helpers/sysfs.h | 30 + tools/power/cpupower/utils/helpers/topology.c | 116 + .../cpupower/utils/idle_monitor/amd_fam14h_idle.c | 335 + .../cpupower/utils/idle_monitor/cpuidle_sysfs.c | 196 + .../cpupower/utils/idle_monitor/cpupower-monitor.c | 455 + .../cpupower/utils/idle_monitor/cpupower-monitor.h | 85 + .../cpupower/utils/idle_monitor/idle_monitors.def | 7 + .../cpupower/utils/idle_monitor/idle_monitors.h | 18 + .../cpupower/utils/idle_monitor/mperf_monitor.c | 338 + tools/power/cpupower/utils/idle_monitor/nhm_idle.c | 216 + tools/power/cpupower/utils/idle_monitor/snb_idle.c | 196 + tools/power/cpupower/utils/version-gen.sh | 35 + tools/power/x86/turbostat/Makefile | 22 + tools/power/x86/turbostat/turbostat.8 | 252 + tools/power/x86/turbostat/turbostat.c | 2349 +++ tools/power/x86/x86_energy_perf_policy/Makefile | 10 + .../x86_energy_perf_policy.8 | 104 + .../x86_energy_perf_policy.c | 324 + tools/scripts/Makefile.include | 79 + tools/testing/fault-injection/failcmd.sh | 219 + tools/testing/ktest/compare-ktest-sample.pl | 32 + tools/testing/ktest/examples/README | 32 + tools/testing/ktest/examples/crosstests.conf | 260 + tools/testing/ktest/examples/include/bisect.conf | 90 + tools/testing/ktest/examples/include/defaults.conf | 157 + .../testing/ktest/examples/include/min-config.conf | 60 + .../testing/ktest/examples/include/patchcheck.conf | 111 + tools/testing/ktest/examples/include/tests.conf | 74 + tools/testing/ktest/examples/kvm.conf | 88 + tools/testing/ktest/examples/snowball.conf | 53 + tools/testing/ktest/examples/test.conf | 62 + tools/testing/ktest/ktest.pl | 4087 ++++ tools/testing/ktest/sample.conf | 1268 ++ tools/testing/selftests/Makefile | 25 + tools/testing/selftests/README.txt | 42 + tools/testing/selftests/breakpoints/Makefile | 23 + .../selftests/breakpoints/breakpoint_test.c | 394 + tools/testing/selftests/cpu-hotplug/Makefile | 6 + tools/testing/selftests/cpu-hotplug/on-off-test.sh | 221 + tools/testing/selftests/efivarfs/Makefile | 12 + tools/testing/selftests/efivarfs/create-read.c | 38 + tools/testing/selftests/efivarfs/efivarfs.sh | 198 + tools/testing/selftests/efivarfs/open-unlink.c | 63 + tools/testing/selftests/ipc/Makefile | 25 + tools/testing/selftests/ipc/msgque.c | 246 + tools/testing/selftests/kcmp/Makefile | 29 + tools/testing/selftests/kcmp/kcmp_test.c | 96 + tools/testing/selftests/memory-hotplug/Makefile | 6 + .../selftests/memory-hotplug/on-off-test.sh | 230 + tools/testing/selftests/mount/Makefile | 17 + .../selftests/mount/unprivileged-remount-test.c | 370 + tools/testing/selftests/mqueue/.gitignore | 2 + tools/testing/selftests/mqueue/Makefile | 10 + tools/testing/selftests/mqueue/mq_open_tests.c | 492 + tools/testing/selftests/mqueue/mq_perf_tests.c | 741 + tools/testing/selftests/net/.gitignore | 3 + tools/testing/selftests/net/Makefile | 19 + tools/testing/selftests/net/psock_fanout.c | 312 + tools/testing/selftests/net/psock_lib.h | 127 + tools/testing/selftests/net/psock_tpacket.c | 824 + tools/testing/selftests/net/run_afpackettests | 26 + tools/testing/selftests/net/run_netsocktests | 12 + tools/testing/selftests/net/socket.c | 92 + tools/testing/selftests/ptrace/Makefile | 10 + tools/testing/selftests/ptrace/peeksiginfo.c | 214 + tools/testing/selftests/vm/Makefile | 14 + tools/testing/selftests/vm/hugepage-mmap.c | 92 + tools/testing/selftests/vm/hugepage-shm.c | 100 + tools/testing/selftests/vm/map_hugetlb.c | 79 + tools/testing/selftests/vm/run_vmtests | 77 + tools/testing/selftests/vm/thuge-gen.c | 254 + tools/usb/Makefile | 13 + tools/usb/ffs-test.c | 527 + tools/usb/hcd-tests.sh | 275 + tools/usb/testusb.c | 537 + tools/virtio/Makefile | 14 + tools/virtio/asm/barrier.h | 14 + tools/virtio/linux/bug.h | 10 + tools/virtio/linux/device.h | 2 + tools/virtio/linux/err.h | 26 + tools/virtio/linux/export.h | 5 + tools/virtio/linux/hrtimer.h | 0 tools/virtio/linux/irqreturn.h | 1 + tools/virtio/linux/kernel.h | 112 + tools/virtio/linux/module.h | 1 + tools/virtio/linux/printk.h | 4 + tools/virtio/linux/ratelimit.h | 4 + tools/virtio/linux/scatterlist.h | 189 + tools/virtio/linux/slab.h | 2 + tools/virtio/linux/types.h | 28 + tools/virtio/linux/uaccess.h | 50 + tools/virtio/linux/uio.h | 3 + tools/virtio/linux/virtio.h | 90 + tools/virtio/linux/virtio_config.h | 6 + tools/virtio/linux/virtio_ring.h | 1 + tools/virtio/linux/vringh.h | 1 + tools/virtio/uapi/linux/uio.h | 1 + tools/virtio/uapi/linux/virtio_config.h | 1 + tools/virtio/uapi/linux/virtio_ring.h | 4 + tools/virtio/vhost_test/Makefile | 2 + tools/virtio/vhost_test/vhost_test.c | 1 + tools/virtio/virtio-trace/Makefile | 13 + tools/virtio/virtio-trace/README | 118 + tools/virtio/virtio-trace/trace-agent-ctl.c | 137 + tools/virtio/virtio-trace/trace-agent-rw.c | 192 + tools/virtio/virtio-trace/trace-agent.c | 270 + tools/virtio/virtio-trace/trace-agent.h | 75 + tools/virtio/virtio_test.c | 288 + tools/virtio/vringh_test.c | 741 + tools/vm/.gitignore | 2 + tools/vm/Makefile | 22 + tools/vm/page-types.c | 1005 + tools/vm/slabinfo.c | 1393 ++ 783 files changed, 189437 insertions(+) create mode 100644 tools/Makefile create mode 100644 tools/cgroup/.gitignore create mode 100644 tools/cgroup/Makefile create mode 100644 tools/cgroup/cgroup_event_listener.c create mode 100644 tools/firewire/Makefile create mode 100644 tools/firewire/decode-fcp.c create mode 100644 tools/firewire/list.h create mode 100644 tools/firewire/nosy-dump.c create mode 100644 tools/firewire/nosy-dump.h create mode 100644 tools/gator/daemon/Android.mk create mode 100644 tools/gator/daemon/AnnotateListener.cpp create mode 100644 tools/gator/daemon/AnnotateListener.h create mode 100644 tools/gator/daemon/Application.mk create mode 100644 tools/gator/daemon/Buffer.cpp create mode 100644 tools/gator/daemon/Buffer.h create mode 100644 tools/gator/daemon/CCNDriver.cpp create mode 100644 tools/gator/daemon/CCNDriver.h create mode 100644 tools/gator/daemon/CPUFreqDriver.cpp create mode 100644 tools/gator/daemon/CPUFreqDriver.h create mode 100644 tools/gator/daemon/CapturedXML.cpp create mode 100644 tools/gator/daemon/CapturedXML.h create mode 100644 tools/gator/daemon/Child.cpp create mode 100644 tools/gator/daemon/Child.h create mode 100644 tools/gator/daemon/Command.cpp create mode 100644 tools/gator/daemon/Command.h create mode 100644 tools/gator/daemon/Config.h create mode 100644 tools/gator/daemon/ConfigurationXML.cpp create mode 100644 tools/gator/daemon/ConfigurationXML.h create mode 100644 tools/gator/daemon/Counter.h create mode 100644 tools/gator/daemon/DiskIODriver.cpp create mode 100644 tools/gator/daemon/DiskIODriver.h create mode 100644 tools/gator/daemon/Driver.cpp create mode 100644 tools/gator/daemon/Driver.h create mode 100644 tools/gator/daemon/DriverSource.cpp create mode 100644 tools/gator/daemon/DriverSource.h create mode 100644 tools/gator/daemon/DynBuf.cpp create mode 100644 tools/gator/daemon/DynBuf.h create mode 100644 tools/gator/daemon/EventsXML.cpp create mode 100644 tools/gator/daemon/EventsXML.h create mode 100644 tools/gator/daemon/ExternalSource.cpp create mode 100644 tools/gator/daemon/ExternalSource.h create mode 100644 tools/gator/daemon/FSDriver.cpp create mode 100644 tools/gator/daemon/FSDriver.h create mode 100644 tools/gator/daemon/Fifo.cpp create mode 100644 tools/gator/daemon/Fifo.h create mode 100644 tools/gator/daemon/FtraceDriver.cpp create mode 100644 tools/gator/daemon/FtraceDriver.h create mode 100644 tools/gator/daemon/FtraceSource.cpp create mode 100644 tools/gator/daemon/FtraceSource.h create mode 100644 tools/gator/daemon/HwmonDriver.cpp create mode 100644 tools/gator/daemon/HwmonDriver.h create mode 100644 tools/gator/daemon/KMod.cpp create mode 100644 tools/gator/daemon/KMod.h create mode 100644 tools/gator/daemon/LocalCapture.cpp create mode 100644 tools/gator/daemon/LocalCapture.h create mode 100644 tools/gator/daemon/Logging.cpp create mode 100644 tools/gator/daemon/Logging.h create mode 100644 tools/gator/daemon/Makefile create mode 100644 tools/gator/daemon/Makefile_aarch64 create mode 100644 tools/gator/daemon/MaliVideoDriver.cpp create mode 100644 tools/gator/daemon/MaliVideoDriver.h create mode 100644 tools/gator/daemon/MemInfoDriver.cpp create mode 100644 tools/gator/daemon/MemInfoDriver.h create mode 100644 tools/gator/daemon/Monitor.cpp create mode 100644 tools/gator/daemon/Monitor.h create mode 100644 tools/gator/daemon/NetDriver.cpp create mode 100644 tools/gator/daemon/NetDriver.h create mode 100644 tools/gator/daemon/OlySocket.cpp create mode 100644 tools/gator/daemon/OlySocket.h create mode 100644 tools/gator/daemon/OlyUtility.cpp create mode 100644 tools/gator/daemon/OlyUtility.h create mode 100644 tools/gator/daemon/PerfBuffer.cpp create mode 100644 tools/gator/daemon/PerfBuffer.h create mode 100644 tools/gator/daemon/PerfDriver.cpp create mode 100644 tools/gator/daemon/PerfDriver.h create mode 100644 tools/gator/daemon/PerfGroup.cpp create mode 100644 tools/gator/daemon/PerfGroup.h create mode 100644 tools/gator/daemon/PerfSource.cpp create mode 100644 tools/gator/daemon/PerfSource.h create mode 100644 tools/gator/daemon/Proc.cpp create mode 100644 tools/gator/daemon/Proc.h create mode 100644 tools/gator/daemon/Sender.cpp create mode 100644 tools/gator/daemon/Sender.h create mode 100644 tools/gator/daemon/SessionData.cpp create mode 100644 tools/gator/daemon/SessionData.h create mode 100644 tools/gator/daemon/SessionXML.cpp create mode 100644 tools/gator/daemon/SessionXML.h create mode 100644 tools/gator/daemon/Setup.cpp create mode 100644 tools/gator/daemon/Setup.h create mode 100644 tools/gator/daemon/Source.cpp create mode 100644 tools/gator/daemon/Source.h create mode 100644 tools/gator/daemon/StreamlineSetup.cpp create mode 100644 tools/gator/daemon/StreamlineSetup.h create mode 100644 tools/gator/daemon/UEvent.cpp create mode 100644 tools/gator/daemon/UEvent.h create mode 100644 tools/gator/daemon/UserSpaceSource.cpp create mode 100644 tools/gator/daemon/UserSpaceSource.h create mode 100644 tools/gator/daemon/c++.cpp create mode 100644 tools/gator/daemon/common.mk create mode 100644 tools/gator/daemon/defaults.xml create mode 100644 tools/gator/daemon/defaults_xml.h create mode 100755 tools/gator/daemon/escape create mode 100644 tools/gator/daemon/escape.c create mode 100644 tools/gator/daemon/events-ARM11.xml create mode 100644 tools/gator/daemon/events-ARM11MPCore.xml create mode 100644 tools/gator/daemon/events-CCI-400.xml create mode 100644 tools/gator/daemon/events-CCN-504.xml create mode 100644 tools/gator/daemon/events-Cortex-A15.xml create mode 100644 tools/gator/daemon/events-Cortex-A17.xml create mode 100644 tools/gator/daemon/events-Cortex-A5.xml create mode 100644 tools/gator/daemon/events-Cortex-A53.xml create mode 100644 tools/gator/daemon/events-Cortex-A57.xml create mode 100644 tools/gator/daemon/events-Cortex-A7.xml create mode 100644 tools/gator/daemon/events-Cortex-A8.xml create mode 100644 tools/gator/daemon/events-Cortex-A9.xml create mode 100644 tools/gator/daemon/events-Filesystem.xml create mode 100644 tools/gator/daemon/events-Krait-architected.xml create mode 100644 tools/gator/daemon/events-L2C-310.xml create mode 100644 tools/gator/daemon/events-Linux.xml create mode 100644 tools/gator/daemon/events-Mali-4xx.xml create mode 100644 tools/gator/daemon/events-Mali-Midgard.xml create mode 100644 tools/gator/daemon/events-Mali-Midgard_hw.xml create mode 100644 tools/gator/daemon/events-Mali-T60x_hw.xml create mode 100644 tools/gator/daemon/events-Mali-T62x_hw.xml create mode 100644 tools/gator/daemon/events-Mali-T72x_hw.xml create mode 100644 tools/gator/daemon/events-Mali-T76x_hw.xml create mode 100644 tools/gator/daemon/events-Mali-V500.xml create mode 100644 tools/gator/daemon/events-Perf-Hardware.xml create mode 100644 tools/gator/daemon/events-Scorpion.xml create mode 100644 tools/gator/daemon/events-ScorpionMP.xml create mode 100644 tools/gator/daemon/events-ftrace.xml create mode 100644 tools/gator/daemon/events.xml create mode 100644 tools/gator/daemon/events_footer.xml create mode 100644 tools/gator/daemon/events_header.xml create mode 100644 tools/gator/daemon/events_xml.h create mode 100644 tools/gator/daemon/k/perf_event.3.12.h create mode 120000 tools/gator/daemon/k/perf_event.h create mode 100644 tools/gator/daemon/libsensors/COPYING.LGPL create mode 100644 tools/gator/daemon/libsensors/access.c create mode 100644 tools/gator/daemon/libsensors/access.h create mode 100644 tools/gator/daemon/libsensors/conf-lex.c create mode 100644 tools/gator/daemon/libsensors/conf-lex.l create mode 100644 tools/gator/daemon/libsensors/conf-parse.c create mode 100644 tools/gator/daemon/libsensors/conf-parse.h create mode 100644 tools/gator/daemon/libsensors/conf-parse.y create mode 100644 tools/gator/daemon/libsensors/conf.h create mode 100644 tools/gator/daemon/libsensors/data.c create mode 100644 tools/gator/daemon/libsensors/data.h create mode 100644 tools/gator/daemon/libsensors/error.c create mode 100644 tools/gator/daemon/libsensors/error.h create mode 100644 tools/gator/daemon/libsensors/general.c create mode 100644 tools/gator/daemon/libsensors/general.h create mode 100644 tools/gator/daemon/libsensors/init.c create mode 100644 tools/gator/daemon/libsensors/init.h create mode 100644 tools/gator/daemon/libsensors/scanner.h create mode 100644 tools/gator/daemon/libsensors/sensors.h create mode 100644 tools/gator/daemon/libsensors/sysfs.c create mode 100644 tools/gator/daemon/libsensors/sysfs.h create mode 100644 tools/gator/daemon/libsensors/version.h create mode 100644 tools/gator/daemon/main.cpp create mode 100644 tools/gator/daemon/mxml/COPYING create mode 100644 tools/gator/daemon/mxml/config.h create mode 100644 tools/gator/daemon/mxml/mxml-attr.c create mode 100644 tools/gator/daemon/mxml/mxml-entity.c create mode 100644 tools/gator/daemon/mxml/mxml-file.c create mode 100644 tools/gator/daemon/mxml/mxml-get.c create mode 100644 tools/gator/daemon/mxml/mxml-index.c create mode 100644 tools/gator/daemon/mxml/mxml-node.c create mode 100644 tools/gator/daemon/mxml/mxml-private.c create mode 100644 tools/gator/daemon/mxml/mxml-private.h create mode 100644 tools/gator/daemon/mxml/mxml-search.c create mode 100644 tools/gator/daemon/mxml/mxml-set.c create mode 100644 tools/gator/daemon/mxml/mxml-string.c create mode 100644 tools/gator/daemon/mxml/mxml.h create mode 100755 tools/hv/hv_get_dhcp_info.sh create mode 100755 tools/hv/hv_get_dns_info.sh create mode 100644 tools/hv/hv_kvp_daemon.c create mode 100755 tools/hv/hv_set_ifconfig.sh create mode 100644 tools/hv/hv_vss_daemon.c create mode 100644 tools/include/tools/be_byteshift.h create mode 100644 tools/include/tools/le_byteshift.h create mode 100644 tools/lguest/.gitignore create mode 100644 tools/lguest/Makefile create mode 100644 tools/lguest/extract create mode 100644 tools/lguest/lguest.c create mode 100644 tools/lguest/lguest.txt create mode 100644 tools/lib/lk/Makefile create mode 100644 tools/lib/lk/debugfs.c create mode 100644 tools/lib/lk/debugfs.h create mode 100644 tools/lib/traceevent/.gitignore create mode 100644 tools/lib/traceevent/Makefile create mode 100644 tools/lib/traceevent/event-parse.c create mode 100644 tools/lib/traceevent/event-parse.h create mode 100644 tools/lib/traceevent/event-utils.h create mode 100644 tools/lib/traceevent/parse-filter.c create mode 100644 tools/lib/traceevent/parse-utils.c create mode 100644 tools/lib/traceevent/trace-seq.c create mode 100644 tools/net/Makefile create mode 100644 tools/net/bpf_jit_disasm.c create mode 100755 tools/nfsd/inject_fault.sh create mode 100644 tools/perf/.gitignore create mode 100644 tools/perf/CREDITS create mode 100644 tools/perf/Documentation/Makefile create mode 100644 tools/perf/Documentation/android.txt create mode 100644 tools/perf/Documentation/asciidoc.conf create mode 100644 tools/perf/Documentation/examples.txt create mode 100644 tools/perf/Documentation/jit-interface.txt create mode 100644 tools/perf/Documentation/manpage-1.72.xsl create mode 100644 tools/perf/Documentation/manpage-base.xsl create mode 100644 tools/perf/Documentation/manpage-bold-literal.xsl create mode 100644 tools/perf/Documentation/manpage-normal.xsl create mode 100644 tools/perf/Documentation/manpage-suppress-sp.xsl create mode 100644 tools/perf/Documentation/perf-annotate.txt create mode 100644 tools/perf/Documentation/perf-archive.txt create mode 100644 tools/perf/Documentation/perf-bench.txt create mode 100644 tools/perf/Documentation/perf-buildid-cache.txt create mode 100644 tools/perf/Documentation/perf-buildid-list.txt create mode 100644 tools/perf/Documentation/perf-diff.txt create mode 100644 tools/perf/Documentation/perf-evlist.txt create mode 100644 tools/perf/Documentation/perf-help.txt create mode 100644 tools/perf/Documentation/perf-inject.txt create mode 100644 tools/perf/Documentation/perf-kmem.txt create mode 100644 tools/perf/Documentation/perf-kvm.txt create mode 100644 tools/perf/Documentation/perf-list.txt create mode 100644 tools/perf/Documentation/perf-lock.txt create mode 100644 tools/perf/Documentation/perf-mem.txt create mode 100644 tools/perf/Documentation/perf-probe.txt create mode 100644 tools/perf/Documentation/perf-record.txt create mode 100644 tools/perf/Documentation/perf-report.txt create mode 100644 tools/perf/Documentation/perf-sched.txt create mode 100644 tools/perf/Documentation/perf-script-perl.txt create mode 100644 tools/perf/Documentation/perf-script-python.txt create mode 100644 tools/perf/Documentation/perf-script.txt create mode 100644 tools/perf/Documentation/perf-stat.txt create mode 100644 tools/perf/Documentation/perf-test.txt create mode 100644 tools/perf/Documentation/perf-timechart.txt create mode 100644 tools/perf/Documentation/perf-top.txt create mode 100644 tools/perf/Documentation/perf-trace.txt create mode 100644 tools/perf/Documentation/perf.txt create mode 100644 tools/perf/Documentation/perfconfig.example create mode 100644 tools/perf/MANIFEST create mode 100644 tools/perf/Makefile create mode 100644 tools/perf/arch/arm/Makefile create mode 100644 tools/perf/arch/arm/util/dwarf-regs.c create mode 100644 tools/perf/arch/common.c create mode 100644 tools/perf/arch/common.h create mode 100644 tools/perf/arch/powerpc/Makefile create mode 100644 tools/perf/arch/powerpc/util/dwarf-regs.c create mode 100644 tools/perf/arch/powerpc/util/header.c create mode 100644 tools/perf/arch/s390/Makefile create mode 100644 tools/perf/arch/s390/util/dwarf-regs.c create mode 100644 tools/perf/arch/sh/Makefile create mode 100644 tools/perf/arch/sh/util/dwarf-regs.c create mode 100644 tools/perf/arch/sparc/Makefile create mode 100644 tools/perf/arch/sparc/util/dwarf-regs.c create mode 100644 tools/perf/arch/x86/Makefile create mode 100644 tools/perf/arch/x86/include/perf_regs.h create mode 100644 tools/perf/arch/x86/util/dwarf-regs.c create mode 100644 tools/perf/arch/x86/util/header.c create mode 100644 tools/perf/arch/x86/util/unwind.c create mode 100644 tools/perf/bash_completion create mode 100644 tools/perf/bench/bench.h create mode 100644 tools/perf/bench/mem-memcpy-arch.h create mode 100644 tools/perf/bench/mem-memcpy-x86-64-asm-def.h create mode 100644 tools/perf/bench/mem-memcpy-x86-64-asm.S create mode 100644 tools/perf/bench/mem-memcpy.c create mode 100644 tools/perf/bench/mem-memset-arch.h create mode 100644 tools/perf/bench/mem-memset-x86-64-asm-def.h create mode 100644 tools/perf/bench/mem-memset-x86-64-asm.S create mode 100644 tools/perf/bench/mem-memset.c create mode 100644 tools/perf/bench/numa.c create mode 100644 tools/perf/bench/sched-messaging.c create mode 100644 tools/perf/bench/sched-pipe.c create mode 100644 tools/perf/builtin-annotate.c create mode 100644 tools/perf/builtin-bench.c create mode 100644 tools/perf/builtin-buildid-cache.c create mode 100644 tools/perf/builtin-buildid-list.c create mode 100644 tools/perf/builtin-diff.c create mode 100644 tools/perf/builtin-evlist.c create mode 100644 tools/perf/builtin-help.c create mode 100644 tools/perf/builtin-inject.c create mode 100644 tools/perf/builtin-kmem.c create mode 100644 tools/perf/builtin-kvm.c create mode 100644 tools/perf/builtin-list.c create mode 100644 tools/perf/builtin-lock.c create mode 100644 tools/perf/builtin-mem.c create mode 100644 tools/perf/builtin-probe.c create mode 100644 tools/perf/builtin-record.c create mode 100644 tools/perf/builtin-report.c create mode 100644 tools/perf/builtin-sched.c create mode 100644 tools/perf/builtin-script.c create mode 100644 tools/perf/builtin-stat.c create mode 100644 tools/perf/builtin-timechart.c create mode 100644 tools/perf/builtin-top.c create mode 100644 tools/perf/builtin-trace.c create mode 100644 tools/perf/builtin.h create mode 100644 tools/perf/command-list.txt create mode 100644 tools/perf/config/feature-tests.mak create mode 100644 tools/perf/config/utilities.mak create mode 100644 tools/perf/design.txt create mode 100644 tools/perf/perf-archive.sh create mode 100644 tools/perf/perf.c create mode 100644 tools/perf/perf.h create mode 100755 tools/perf/python/twatch.py create mode 100644 tools/perf/scripts/perl/Perf-Trace-Util/Context.c create mode 100644 tools/perf/scripts/perl/Perf-Trace-Util/Context.xs create mode 100644 tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL create mode 100644 tools/perf/scripts/perl/Perf-Trace-Util/README create mode 100644 tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Context.pm create mode 100644 tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm create mode 100644 tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm create mode 100644 tools/perf/scripts/perl/Perf-Trace-Util/typemap create mode 100644 tools/perf/scripts/perl/bin/check-perf-trace-record create mode 100644 tools/perf/scripts/perl/bin/failed-syscalls-record create mode 100644 tools/perf/scripts/perl/bin/failed-syscalls-report create mode 100644 tools/perf/scripts/perl/bin/rw-by-file-record create mode 100644 tools/perf/scripts/perl/bin/rw-by-file-report create mode 100644 tools/perf/scripts/perl/bin/rw-by-pid-record create mode 100644 tools/perf/scripts/perl/bin/rw-by-pid-report create mode 100644 tools/perf/scripts/perl/bin/rwtop-record create mode 100644 tools/perf/scripts/perl/bin/rwtop-report create mode 100644 tools/perf/scripts/perl/bin/wakeup-latency-record create mode 100644 tools/perf/scripts/perl/bin/wakeup-latency-report create mode 100644 tools/perf/scripts/perl/check-perf-trace.pl create mode 100644 tools/perf/scripts/perl/failed-syscalls.pl create mode 100644 tools/perf/scripts/perl/rw-by-file.pl create mode 100644 tools/perf/scripts/perl/rw-by-pid.pl create mode 100644 tools/perf/scripts/perl/rwtop.pl create mode 100644 tools/perf/scripts/perl/wakeup-latency.pl create mode 100644 tools/perf/scripts/python/Perf-Trace-Util/Context.c create mode 100644 tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py create mode 100755 tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py create mode 100644 tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py create mode 100644 tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py create mode 100644 tools/perf/scripts/python/bin/event_analyzing_sample-record create mode 100644 tools/perf/scripts/python/bin/event_analyzing_sample-report create mode 100644 tools/perf/scripts/python/bin/failed-syscalls-by-pid-record create mode 100644 tools/perf/scripts/python/bin/failed-syscalls-by-pid-report create mode 100644 tools/perf/scripts/python/bin/futex-contention-record create mode 100644 tools/perf/scripts/python/bin/futex-contention-report create mode 100755 tools/perf/scripts/python/bin/net_dropmonitor-record create mode 100755 tools/perf/scripts/python/bin/net_dropmonitor-report create mode 100644 tools/perf/scripts/python/bin/netdev-times-record create mode 100644 tools/perf/scripts/python/bin/netdev-times-report create mode 100644 tools/perf/scripts/python/bin/sched-migration-record create mode 100644 tools/perf/scripts/python/bin/sched-migration-report create mode 100644 tools/perf/scripts/python/bin/sctop-record create mode 100644 tools/perf/scripts/python/bin/sctop-report create mode 100644 tools/perf/scripts/python/bin/syscall-counts-by-pid-record create mode 100644 tools/perf/scripts/python/bin/syscall-counts-by-pid-report create mode 100644 tools/perf/scripts/python/bin/syscall-counts-record create mode 100644 tools/perf/scripts/python/bin/syscall-counts-report create mode 100644 tools/perf/scripts/python/check-perf-trace.py create mode 100644 tools/perf/scripts/python/event_analyzing_sample.py create mode 100644 tools/perf/scripts/python/failed-syscalls-by-pid.py create mode 100644 tools/perf/scripts/python/futex-contention.py create mode 100755 tools/perf/scripts/python/net_dropmonitor.py create mode 100644 tools/perf/scripts/python/netdev-times.py create mode 100644 tools/perf/scripts/python/sched-migration.py create mode 100644 tools/perf/scripts/python/sctop.py create mode 100644 tools/perf/scripts/python/syscall-counts-by-pid.py create mode 100644 tools/perf/scripts/python/syscall-counts.py create mode 100644 tools/perf/tests/attr.c create mode 100644 tools/perf/tests/attr.py create mode 100644 tools/perf/tests/attr/README create mode 100644 tools/perf/tests/attr/base-record create mode 100644 tools/perf/tests/attr/base-stat create mode 100644 tools/perf/tests/attr/test-record-C0 create mode 100644 tools/perf/tests/attr/test-record-basic create mode 100644 tools/perf/tests/attr/test-record-branch-any create mode 100644 tools/perf/tests/attr/test-record-branch-filter-any create mode 100644 tools/perf/tests/attr/test-record-branch-filter-any_call create mode 100644 tools/perf/tests/attr/test-record-branch-filter-any_ret create mode 100644 tools/perf/tests/attr/test-record-branch-filter-hv create mode 100644 tools/perf/tests/attr/test-record-branch-filter-ind_call create mode 100644 tools/perf/tests/attr/test-record-branch-filter-k create mode 100644 tools/perf/tests/attr/test-record-branch-filter-u create mode 100644 tools/perf/tests/attr/test-record-count create mode 100644 tools/perf/tests/attr/test-record-data create mode 100644 tools/perf/tests/attr/test-record-freq create mode 100644 tools/perf/tests/attr/test-record-graph-default create mode 100644 tools/perf/tests/attr/test-record-graph-dwarf create mode 100644 tools/perf/tests/attr/test-record-graph-fp create mode 100644 tools/perf/tests/attr/test-record-group create mode 100644 tools/perf/tests/attr/test-record-group1 create mode 100644 tools/perf/tests/attr/test-record-no-delay create mode 100644 tools/perf/tests/attr/test-record-no-inherit create mode 100644 tools/perf/tests/attr/test-record-no-samples create mode 100644 tools/perf/tests/attr/test-record-period create mode 100644 tools/perf/tests/attr/test-record-raw create mode 100644 tools/perf/tests/attr/test-stat-C0 create mode 100644 tools/perf/tests/attr/test-stat-basic create mode 100644 tools/perf/tests/attr/test-stat-default create mode 100644 tools/perf/tests/attr/test-stat-detailed-1 create mode 100644 tools/perf/tests/attr/test-stat-detailed-2 create mode 100644 tools/perf/tests/attr/test-stat-detailed-3 create mode 100644 tools/perf/tests/attr/test-stat-group create mode 100644 tools/perf/tests/attr/test-stat-group1 create mode 100644 tools/perf/tests/attr/test-stat-no-inherit create mode 100644 tools/perf/tests/bp_signal.c create mode 100644 tools/perf/tests/bp_signal_overflow.c create mode 100644 tools/perf/tests/builtin-test.c create mode 100644 tools/perf/tests/dso-data.c create mode 100644 tools/perf/tests/evsel-roundtrip-name.c create mode 100644 tools/perf/tests/evsel-tp-sched.c create mode 100644 tools/perf/tests/hists_link.c create mode 100644 tools/perf/tests/mmap-basic.c create mode 100644 tools/perf/tests/open-syscall-all-cpus.c create mode 100644 tools/perf/tests/open-syscall-tp-fields.c create mode 100644 tools/perf/tests/open-syscall.c create mode 100644 tools/perf/tests/parse-events.c create mode 100644 tools/perf/tests/perf-record.c create mode 100644 tools/perf/tests/pmu.c create mode 100644 tools/perf/tests/python-use.c create mode 100644 tools/perf/tests/rdpmc.c create mode 100644 tools/perf/tests/sw-clock.c create mode 100644 tools/perf/tests/task-exit.c create mode 100644 tools/perf/tests/tests.h create mode 100644 tools/perf/tests/vmlinux-kallsyms.c create mode 100644 tools/perf/ui/browser.c create mode 100644 tools/perf/ui/browser.h create mode 100644 tools/perf/ui/browsers/annotate.c create mode 100644 tools/perf/ui/browsers/hists.c create mode 100644 tools/perf/ui/browsers/map.c create mode 100644 tools/perf/ui/browsers/map.h create mode 100644 tools/perf/ui/browsers/scripts.c create mode 100644 tools/perf/ui/gtk/annotate.c create mode 100644 tools/perf/ui/gtk/browser.c create mode 100644 tools/perf/ui/gtk/gtk.h create mode 100644 tools/perf/ui/gtk/helpline.c create mode 100644 tools/perf/ui/gtk/hists.c create mode 100644 tools/perf/ui/gtk/progress.c create mode 100644 tools/perf/ui/gtk/setup.c create mode 100644 tools/perf/ui/gtk/util.c create mode 100644 tools/perf/ui/helpline.c create mode 100644 tools/perf/ui/helpline.h create mode 100644 tools/perf/ui/hist.c create mode 100644 tools/perf/ui/keysyms.h create mode 100644 tools/perf/ui/libslang.h create mode 100644 tools/perf/ui/progress.c create mode 100644 tools/perf/ui/progress.h create mode 100644 tools/perf/ui/setup.c create mode 100644 tools/perf/ui/stdio/hist.c create mode 100644 tools/perf/ui/tui/helpline.c create mode 100644 tools/perf/ui/tui/progress.c create mode 100644 tools/perf/ui/tui/setup.c create mode 100644 tools/perf/ui/tui/util.c create mode 100644 tools/perf/ui/ui.h create mode 100644 tools/perf/ui/util.c create mode 100644 tools/perf/ui/util.h create mode 100755 tools/perf/util/PERF-VERSION-GEN create mode 100644 tools/perf/util/abspath.c create mode 100644 tools/perf/util/alias.c create mode 100644 tools/perf/util/annotate.c create mode 100644 tools/perf/util/annotate.h create mode 100644 tools/perf/util/bitmap.c create mode 100644 tools/perf/util/build-id.c create mode 100644 tools/perf/util/build-id.h create mode 100644 tools/perf/util/cache.h create mode 100644 tools/perf/util/callchain.c create mode 100644 tools/perf/util/callchain.h create mode 100644 tools/perf/util/cgroup.c create mode 100644 tools/perf/util/cgroup.h create mode 100644 tools/perf/util/color.c create mode 100644 tools/perf/util/color.h create mode 100644 tools/perf/util/config.c create mode 100644 tools/perf/util/cpumap.c create mode 100644 tools/perf/util/cpumap.h create mode 100644 tools/perf/util/ctype.c create mode 100644 tools/perf/util/debug.c create mode 100644 tools/perf/util/debug.h create mode 100644 tools/perf/util/dso.c create mode 100644 tools/perf/util/dso.h create mode 100644 tools/perf/util/dwarf-aux.c create mode 100644 tools/perf/util/dwarf-aux.h create mode 100644 tools/perf/util/environment.c create mode 100644 tools/perf/util/event.c create mode 100644 tools/perf/util/event.h create mode 100644 tools/perf/util/evlist.c create mode 100644 tools/perf/util/evlist.h create mode 100644 tools/perf/util/evsel.c create mode 100644 tools/perf/util/evsel.h create mode 100644 tools/perf/util/exec_cmd.c create mode 100644 tools/perf/util/exec_cmd.h create mode 100755 tools/perf/util/generate-cmdlist.sh create mode 100644 tools/perf/util/header.c create mode 100644 tools/perf/util/header.h create mode 100644 tools/perf/util/help.c create mode 100644 tools/perf/util/help.h create mode 100644 tools/perf/util/hist.c create mode 100644 tools/perf/util/hist.h create mode 100644 tools/perf/util/hweight.c create mode 100644 tools/perf/util/include/asm/alternative-asm.h create mode 100644 tools/perf/util/include/asm/asm-offsets.h create mode 100644 tools/perf/util/include/asm/bug.h create mode 100644 tools/perf/util/include/asm/byteorder.h create mode 100644 tools/perf/util/include/asm/cpufeature.h create mode 100644 tools/perf/util/include/asm/dwarf2.h create mode 100644 tools/perf/util/include/asm/hweight.h create mode 100644 tools/perf/util/include/asm/swab.h create mode 100644 tools/perf/util/include/asm/system.h create mode 100644 tools/perf/util/include/asm/uaccess.h create mode 100644 tools/perf/util/include/asm/unistd_32.h create mode 100644 tools/perf/util/include/asm/unistd_64.h create mode 100644 tools/perf/util/include/dwarf-regs.h create mode 100644 tools/perf/util/include/linux/bitmap.h create mode 100644 tools/perf/util/include/linux/bitops.h create mode 100644 tools/perf/util/include/linux/compiler.h create mode 100644 tools/perf/util/include/linux/const.h create mode 100644 tools/perf/util/include/linux/ctype.h create mode 100644 tools/perf/util/include/linux/export.h create mode 100644 tools/perf/util/include/linux/hash.h create mode 100644 tools/perf/util/include/linux/kernel.h create mode 100644 tools/perf/util/include/linux/linkage.h create mode 100644 tools/perf/util/include/linux/list.h create mode 100644 tools/perf/util/include/linux/magic.h create mode 100644 tools/perf/util/include/linux/poison.h create mode 100644 tools/perf/util/include/linux/prefetch.h create mode 100644 tools/perf/util/include/linux/rbtree.h create mode 100644 tools/perf/util/include/linux/rbtree_augmented.h create mode 100644 tools/perf/util/include/linux/string.h create mode 100644 tools/perf/util/include/linux/types.h create mode 100644 tools/perf/util/intlist.c create mode 100644 tools/perf/util/intlist.h create mode 100644 tools/perf/util/levenshtein.c create mode 100644 tools/perf/util/levenshtein.h create mode 100644 tools/perf/util/machine.c create mode 100644 tools/perf/util/machine.h create mode 100644 tools/perf/util/map.c create mode 100644 tools/perf/util/map.h create mode 100644 tools/perf/util/pager.c create mode 100644 tools/perf/util/parse-events.c create mode 100644 tools/perf/util/parse-events.h create mode 100644 tools/perf/util/parse-events.l create mode 100644 tools/perf/util/parse-events.y create mode 100644 tools/perf/util/parse-options.c create mode 100644 tools/perf/util/parse-options.h create mode 100644 tools/perf/util/path.c create mode 100644 tools/perf/util/perf_regs.h create mode 100644 tools/perf/util/pmu.c create mode 100644 tools/perf/util/pmu.h create mode 100644 tools/perf/util/pmu.l create mode 100644 tools/perf/util/pmu.y create mode 100644 tools/perf/util/probe-event.c create mode 100644 tools/perf/util/probe-event.h create mode 100644 tools/perf/util/probe-finder.c create mode 100644 tools/perf/util/probe-finder.h create mode 100644 tools/perf/util/pstack.c create mode 100644 tools/perf/util/pstack.h create mode 100644 tools/perf/util/python-ext-sources create mode 100644 tools/perf/util/python.c create mode 100644 tools/perf/util/quote.c create mode 100644 tools/perf/util/quote.h create mode 100644 tools/perf/util/rblist.c create mode 100644 tools/perf/util/rblist.h create mode 100644 tools/perf/util/run-command.c create mode 100644 tools/perf/util/run-command.h create mode 100644 tools/perf/util/scripting-engines/trace-event-perl.c create mode 100644 tools/perf/util/scripting-engines/trace-event-python.c create mode 100644 tools/perf/util/session.c create mode 100644 tools/perf/util/session.h create mode 100644 tools/perf/util/setup.py create mode 100644 tools/perf/util/sigchain.c create mode 100644 tools/perf/util/sigchain.h create mode 100644 tools/perf/util/sort.c create mode 100644 tools/perf/util/sort.h create mode 100644 tools/perf/util/stat.c create mode 100644 tools/perf/util/stat.h create mode 100644 tools/perf/util/strbuf.c create mode 100644 tools/perf/util/strbuf.h create mode 100644 tools/perf/util/strfilter.c create mode 100644 tools/perf/util/strfilter.h create mode 100644 tools/perf/util/string.c create mode 100644 tools/perf/util/strlist.c create mode 100644 tools/perf/util/strlist.h create mode 100644 tools/perf/util/svghelper.c create mode 100644 tools/perf/util/svghelper.h create mode 100644 tools/perf/util/symbol-elf.c create mode 100644 tools/perf/util/symbol-minimal.c create mode 100644 tools/perf/util/symbol.c create mode 100644 tools/perf/util/symbol.h create mode 100644 tools/perf/util/sysfs.c create mode 100644 tools/perf/util/sysfs.h create mode 100644 tools/perf/util/target.c create mode 100644 tools/perf/util/target.h create mode 100644 tools/perf/util/thread.c create mode 100644 tools/perf/util/thread.h create mode 100644 tools/perf/util/thread_map.c create mode 100644 tools/perf/util/thread_map.h create mode 100644 tools/perf/util/tool.h create mode 100644 tools/perf/util/top.c create mode 100644 tools/perf/util/top.h create mode 100644 tools/perf/util/trace-event-info.c create mode 100644 tools/perf/util/trace-event-parse.c create mode 100644 tools/perf/util/trace-event-read.c create mode 100644 tools/perf/util/trace-event-scripting.c create mode 100644 tools/perf/util/trace-event.h create mode 100644 tools/perf/util/types.h create mode 100644 tools/perf/util/unwind.c create mode 100644 tools/perf/util/unwind.h create mode 100644 tools/perf/util/usage.c create mode 100644 tools/perf/util/util.c create mode 100644 tools/perf/util/util.h create mode 100644 tools/perf/util/values.c create mode 100644 tools/perf/util/values.h create mode 100644 tools/perf/util/vdso.c create mode 100644 tools/perf/util/vdso.h create mode 100644 tools/perf/util/wrapper.c create mode 100644 tools/perf/util/xyarray.c create mode 100644 tools/perf/util/xyarray.h create mode 100644 tools/power/acpi/Makefile create mode 100644 tools/power/acpi/acpidump.8 create mode 100644 tools/power/acpi/acpidump.c create mode 100644 tools/power/cpupower/.gitignore create mode 100644 tools/power/cpupower/Makefile create mode 100644 tools/power/cpupower/README create mode 100644 tools/power/cpupower/ToDo create mode 100644 tools/power/cpupower/bench/Makefile create mode 100644 tools/power/cpupower/bench/README-BENCH create mode 100644 tools/power/cpupower/bench/benchmark.c create mode 100644 tools/power/cpupower/bench/benchmark.h create mode 100644 tools/power/cpupower/bench/config.h create mode 100644 tools/power/cpupower/bench/cpufreq-bench_plot.sh create mode 100644 tools/power/cpupower/bench/cpufreq-bench_script.sh create mode 100644 tools/power/cpupower/bench/example.cfg create mode 100644 tools/power/cpupower/bench/main.c create mode 100644 tools/power/cpupower/bench/parse.c create mode 100644 tools/power/cpupower/bench/parse.h create mode 100644 tools/power/cpupower/bench/system.c create mode 100644 tools/power/cpupower/bench/system.h create mode 100644 tools/power/cpupower/debug/i386/Makefile create mode 100644 tools/power/cpupower/debug/i386/centrino-decode.c create mode 100644 tools/power/cpupower/debug/i386/dump_psb.c create mode 100644 tools/power/cpupower/debug/i386/intel_gsic.c create mode 100644 tools/power/cpupower/debug/i386/powernow-k8-decode.c create mode 100644 tools/power/cpupower/debug/kernel/Makefile create mode 100644 tools/power/cpupower/debug/kernel/cpufreq-test_tsc.c create mode 100644 tools/power/cpupower/debug/x86_64/Makefile create mode 100644 tools/power/cpupower/lib/cpufreq.c create mode 100644 tools/power/cpupower/lib/cpufreq.h create mode 100644 tools/power/cpupower/lib/sysfs.c create mode 100644 tools/power/cpupower/lib/sysfs.h create mode 100644 tools/power/cpupower/man/cpupower-frequency-info.1 create mode 100644 tools/power/cpupower/man/cpupower-frequency-set.1 create mode 100644 tools/power/cpupower/man/cpupower-idle-info.1 create mode 100644 tools/power/cpupower/man/cpupower-info.1 create mode 100644 tools/power/cpupower/man/cpupower-monitor.1 create mode 100644 tools/power/cpupower/man/cpupower-set.1 create mode 100644 tools/power/cpupower/man/cpupower.1 create mode 100644 tools/power/cpupower/po/cs.po create mode 100644 tools/power/cpupower/po/de.po create mode 100644 tools/power/cpupower/po/fr.po create mode 100644 tools/power/cpupower/po/it.po create mode 100644 tools/power/cpupower/po/pt.po create mode 100644 tools/power/cpupower/utils/builtin.h create mode 100644 tools/power/cpupower/utils/cpufreq-info.c create mode 100644 tools/power/cpupower/utils/cpufreq-set.c create mode 100644 tools/power/cpupower/utils/cpuidle-info.c create mode 100644 tools/power/cpupower/utils/cpupower-info.c create mode 100644 tools/power/cpupower/utils/cpupower-set.c create mode 100644 tools/power/cpupower/utils/cpupower.c create mode 100644 tools/power/cpupower/utils/helpers/amd.c create mode 100644 tools/power/cpupower/utils/helpers/bitmask.c create mode 100644 tools/power/cpupower/utils/helpers/bitmask.h create mode 100644 tools/power/cpupower/utils/helpers/cpuid.c create mode 100644 tools/power/cpupower/utils/helpers/helpers.h create mode 100644 tools/power/cpupower/utils/helpers/misc.c create mode 100644 tools/power/cpupower/utils/helpers/msr.c create mode 100644 tools/power/cpupower/utils/helpers/pci.c create mode 100644 tools/power/cpupower/utils/helpers/sysfs.c create mode 100644 tools/power/cpupower/utils/helpers/sysfs.h create mode 100644 tools/power/cpupower/utils/helpers/topology.c create mode 100644 tools/power/cpupower/utils/idle_monitor/amd_fam14h_idle.c create mode 100644 tools/power/cpupower/utils/idle_monitor/cpuidle_sysfs.c create mode 100644 tools/power/cpupower/utils/idle_monitor/cpupower-monitor.c create mode 100644 tools/power/cpupower/utils/idle_monitor/cpupower-monitor.h create mode 100644 tools/power/cpupower/utils/idle_monitor/idle_monitors.def create mode 100644 tools/power/cpupower/utils/idle_monitor/idle_monitors.h create mode 100644 tools/power/cpupower/utils/idle_monitor/mperf_monitor.c create mode 100644 tools/power/cpupower/utils/idle_monitor/nhm_idle.c create mode 100644 tools/power/cpupower/utils/idle_monitor/snb_idle.c create mode 100755 tools/power/cpupower/utils/version-gen.sh create mode 100644 tools/power/x86/turbostat/Makefile create mode 100644 tools/power/x86/turbostat/turbostat.8 create mode 100644 tools/power/x86/turbostat/turbostat.c create mode 100644 tools/power/x86/x86_energy_perf_policy/Makefile create mode 100644 tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.8 create mode 100644 tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c create mode 100644 tools/scripts/Makefile.include create mode 100644 tools/testing/fault-injection/failcmd.sh create mode 100755 tools/testing/ktest/compare-ktest-sample.pl create mode 100644 tools/testing/ktest/examples/README create mode 100644 tools/testing/ktest/examples/crosstests.conf create mode 100644 tools/testing/ktest/examples/include/bisect.conf create mode 100644 tools/testing/ktest/examples/include/defaults.conf create mode 100644 tools/testing/ktest/examples/include/min-config.conf create mode 100644 tools/testing/ktest/examples/include/patchcheck.conf create mode 100644 tools/testing/ktest/examples/include/tests.conf create mode 100644 tools/testing/ktest/examples/kvm.conf create mode 100644 tools/testing/ktest/examples/snowball.conf create mode 100644 tools/testing/ktest/examples/test.conf create mode 100755 tools/testing/ktest/ktest.pl create mode 100644 tools/testing/ktest/sample.conf create mode 100644 tools/testing/selftests/Makefile create mode 100644 tools/testing/selftests/README.txt create mode 100644 tools/testing/selftests/breakpoints/Makefile create mode 100644 tools/testing/selftests/breakpoints/breakpoint_test.c create mode 100644 tools/testing/selftests/cpu-hotplug/Makefile create mode 100644 tools/testing/selftests/cpu-hotplug/on-off-test.sh create mode 100644 tools/testing/selftests/efivarfs/Makefile create mode 100644 tools/testing/selftests/efivarfs/create-read.c create mode 100644 tools/testing/selftests/efivarfs/efivarfs.sh create mode 100644 tools/testing/selftests/efivarfs/open-unlink.c create mode 100644 tools/testing/selftests/ipc/Makefile create mode 100644 tools/testing/selftests/ipc/msgque.c create mode 100644 tools/testing/selftests/kcmp/Makefile create mode 100644 tools/testing/selftests/kcmp/kcmp_test.c create mode 100644 tools/testing/selftests/memory-hotplug/Makefile create mode 100644 tools/testing/selftests/memory-hotplug/on-off-test.sh create mode 100644 tools/testing/selftests/mount/Makefile create mode 100644 tools/testing/selftests/mount/unprivileged-remount-test.c create mode 100644 tools/testing/selftests/mqueue/.gitignore create mode 100644 tools/testing/selftests/mqueue/Makefile create mode 100644 tools/testing/selftests/mqueue/mq_open_tests.c create mode 100644 tools/testing/selftests/mqueue/mq_perf_tests.c create mode 100644 tools/testing/selftests/net/.gitignore create mode 100644 tools/testing/selftests/net/Makefile create mode 100644 tools/testing/selftests/net/psock_fanout.c create mode 100644 tools/testing/selftests/net/psock_lib.h create mode 100644 tools/testing/selftests/net/psock_tpacket.c create mode 100644 tools/testing/selftests/net/run_afpackettests create mode 100644 tools/testing/selftests/net/run_netsocktests create mode 100644 tools/testing/selftests/net/socket.c create mode 100644 tools/testing/selftests/ptrace/Makefile create mode 100644 tools/testing/selftests/ptrace/peeksiginfo.c create mode 100644 tools/testing/selftests/vm/Makefile create mode 100644 tools/testing/selftests/vm/hugepage-mmap.c create mode 100644 tools/testing/selftests/vm/hugepage-shm.c create mode 100644 tools/testing/selftests/vm/map_hugetlb.c create mode 100644 tools/testing/selftests/vm/run_vmtests create mode 100644 tools/testing/selftests/vm/thuge-gen.c create mode 100644 tools/usb/Makefile create mode 100644 tools/usb/ffs-test.c create mode 100644 tools/usb/hcd-tests.sh create mode 100644 tools/usb/testusb.c create mode 100644 tools/virtio/Makefile create mode 100644 tools/virtio/asm/barrier.h create mode 100644 tools/virtio/linux/bug.h create mode 100644 tools/virtio/linux/device.h create mode 100644 tools/virtio/linux/err.h create mode 100644 tools/virtio/linux/export.h create mode 100644 tools/virtio/linux/hrtimer.h create mode 100644 tools/virtio/linux/irqreturn.h create mode 100644 tools/virtio/linux/kernel.h create mode 100644 tools/virtio/linux/module.h create mode 100644 tools/virtio/linux/printk.h create mode 100644 tools/virtio/linux/ratelimit.h create mode 100644 tools/virtio/linux/scatterlist.h create mode 100644 tools/virtio/linux/slab.h create mode 100644 tools/virtio/linux/types.h create mode 100644 tools/virtio/linux/uaccess.h create mode 100644 tools/virtio/linux/uio.h create mode 100644 tools/virtio/linux/virtio.h create mode 100644 tools/virtio/linux/virtio_config.h create mode 100644 tools/virtio/linux/virtio_ring.h create mode 100644 tools/virtio/linux/vringh.h create mode 100644 tools/virtio/uapi/linux/uio.h create mode 100644 tools/virtio/uapi/linux/virtio_config.h create mode 100644 tools/virtio/uapi/linux/virtio_ring.h create mode 100644 tools/virtio/vhost_test/Makefile create mode 100644 tools/virtio/vhost_test/vhost_test.c create mode 100644 tools/virtio/virtio-trace/Makefile create mode 100644 tools/virtio/virtio-trace/README create mode 100644 tools/virtio/virtio-trace/trace-agent-ctl.c create mode 100644 tools/virtio/virtio-trace/trace-agent-rw.c create mode 100644 tools/virtio/virtio-trace/trace-agent.c create mode 100644 tools/virtio/virtio-trace/trace-agent.h create mode 100644 tools/virtio/virtio_test.c create mode 100644 tools/virtio/vringh_test.c create mode 100644 tools/vm/.gitignore create mode 100644 tools/vm/Makefile create mode 100644 tools/vm/page-types.c create mode 100644 tools/vm/slabinfo.c (limited to 'tools') diff --git a/tools/Makefile b/tools/Makefile new file mode 100644 index 00000000..41067f30 --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,91 @@ +include scripts/Makefile.include + +help: + @echo 'Possible targets:' + @echo '' + @echo ' cgroup - cgroup tools' + @echo ' cpupower - a tool for all things x86 CPU power' + @echo ' firewire - the userspace part of nosy, an IEEE-1394 traffic sniffer' + @echo ' lguest - a minimal 32-bit x86 hypervisor' + @echo ' perf - Linux performance measurement and analysis tool' + @echo ' selftests - various kernel selftests' + @echo ' turbostat - Intel CPU idle stats and freq reporting tool' + @echo ' usb - USB testing tools' + @echo ' virtio - vhost test module' + @echo ' net - misc networking tools' + @echo ' vm - misc vm tools' + @echo ' x86_energy_perf_policy - Intel energy policy tool' + @echo '' + @echo 'You can do:' + @echo ' $$ make -C tools/ _install' + @echo '' + @echo ' from the kernel command line to build and install one of' + @echo ' the tools above' + @echo '' + @echo ' $$ make tools/install' + @echo '' + @echo ' installs all tools.' + @echo '' + @echo 'Cleaning targets:' + @echo '' + @echo ' all of the above with the "_clean" string appended cleans' + @echo ' the respective build directory.' + @echo ' clean: a summary clean target to clean _all_ folders' + +cpupower: FORCE + $(call descend,power/$@) + +cgroup firewire guest usb virtio vm net: FORCE + $(call descend,$@) + +liblk: FORCE + $(call descend,lib/lk) + +perf: liblk FORCE + $(call descend,$@) + +selftests: FORCE + $(call descend,testing/$@) + +turbostat x86_energy_perf_policy: FORCE + $(call descend,power/x86/$@) + +cpupower_install: + $(call descend,power/$(@:_install=),install) + +cgroup_install firewire_install lguest_install perf_install usb_install virtio_install vm_install net_install: + $(call descend,$(@:_install=),install) + +selftests_install: + $(call descend,testing/$(@:_clean=),install) + +turbostat_install x86_energy_perf_policy_install: + $(call descend,power/x86/$(@:_install=),install) + +install: cgroup_install cpupower_install firewire_install lguest_install \ + perf_install selftests_install turbostat_install usb_install \ + virtio_install vm_install net_install x86_energy_perf_policy_install + +cpupower_clean: + $(call descend,power/cpupower,clean) + +cgroup_clean firewire_clean lguest_clean usb_clean virtio_clean vm_clean net_clean: + $(call descend,$(@:_clean=),clean) + +liblk_clean: + $(call descend,lib/lk,clean) + +perf_clean: liblk_clean + $(call descend,$(@:_clean=),clean) + +selftests_clean: + $(call descend,testing/$(@:_clean=),clean) + +turbostat_clean x86_energy_perf_policy_clean: + $(call descend,power/x86/$(@:_clean=),clean) + +clean: cgroup_clean cpupower_clean firewire_clean lguest_clean perf_clean \ + selftests_clean turbostat_clean usb_clean virtio_clean \ + vm_clean net_clean x86_energy_perf_policy_clean + +.PHONY: FORCE diff --git a/tools/cgroup/.gitignore b/tools/cgroup/.gitignore new file mode 100644 index 00000000..633cd9b8 --- /dev/null +++ b/tools/cgroup/.gitignore @@ -0,0 +1 @@ +cgroup_event_listener diff --git a/tools/cgroup/Makefile b/tools/cgroup/Makefile new file mode 100644 index 00000000..b4286196 --- /dev/null +++ b/tools/cgroup/Makefile @@ -0,0 +1,11 @@ +# Makefile for cgroup tools + +CC = $(CROSS_COMPILE)gcc +CFLAGS = -Wall -Wextra + +all: cgroup_event_listener +%: %.c + $(CC) $(CFLAGS) -o $@ $^ + +clean: + $(RM) cgroup_event_listener diff --git a/tools/cgroup/cgroup_event_listener.c b/tools/cgroup/cgroup_event_listener.c new file mode 100644 index 00000000..4eb55072 --- /dev/null +++ b/tools/cgroup/cgroup_event_listener.c @@ -0,0 +1,82 @@ +/* + * cgroup_event_listener.c - Simple listener of cgroup events + * + * Copyright (C) Kirill A. Shutemov + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define USAGE_STR "Usage: cgroup_event_listener " + +int main(int argc, char **argv) +{ + int efd = -1; + int cfd = -1; + int event_control = -1; + char event_control_path[PATH_MAX]; + char line[LINE_MAX]; + int ret; + + if (argc != 3) + errx(1, "%s", USAGE_STR); + + cfd = open(argv[1], O_RDONLY); + if (cfd == -1) + err(1, "Cannot open %s", argv[1]); + + ret = snprintf(event_control_path, PATH_MAX, "%s/cgroup.event_control", + dirname(argv[1])); + if (ret >= PATH_MAX) + errx(1, "Path to cgroup.event_control is too long"); + + event_control = open(event_control_path, O_WRONLY); + if (event_control == -1) + err(1, "Cannot open %s", event_control_path); + + efd = eventfd(0, 0); + if (efd == -1) + err(1, "eventfd() failed"); + + ret = snprintf(line, LINE_MAX, "%d %d %s", efd, cfd, argv[2]); + if (ret >= LINE_MAX) + errx(1, "Arguments string is too long"); + + ret = write(event_control, line, strlen(line) + 1); + if (ret == -1) + err(1, "Cannot write to cgroup.event_control"); + + while (1) { + uint64_t result; + + ret = read(efd, &result, sizeof(result)); + if (ret == -1) { + if (errno == EINTR) + continue; + err(1, "Cannot read from eventfd"); + } + assert(ret == sizeof(result)); + + ret = access(event_control_path, W_OK); + if ((ret == -1) && (errno == ENOENT)) { + puts("The cgroup seems to have removed."); + break; + } + + if (ret == -1) + err(1, "cgroup.event_control is not accessible any more"); + + printf("%s %s: crossed\n", argv[1], argv[2]); + } + + return 0; +} diff --git a/tools/firewire/Makefile b/tools/firewire/Makefile new file mode 100644 index 00000000..81767ada --- /dev/null +++ b/tools/firewire/Makefile @@ -0,0 +1,19 @@ +prefix = /usr +nosy-dump-version = 0.4 + +CC = gcc + +all : nosy-dump + +nosy-dump : CFLAGS = -Wall -O2 -g +nosy-dump : CPPFLAGS = -DVERSION=\"$(nosy-dump-version)\" -I../../drivers/firewire +nosy-dump : LDFLAGS = -g +nosy-dump : LDLIBS = -lpopt + +nosy-dump : nosy-dump.o decode-fcp.o + +clean : + rm -rf *.o nosy-dump + +install : + install nosy-dump $(prefix)/bin/nosy-dump diff --git a/tools/firewire/decode-fcp.c b/tools/firewire/decode-fcp.c new file mode 100644 index 00000000..e41223b6 --- /dev/null +++ b/tools/firewire/decode-fcp.c @@ -0,0 +1,213 @@ +#include +#include +#include + +#include "list.h" +#include "nosy-dump.h" + +#define CSR_FCP_COMMAND 0xfffff0000b00ull +#define CSR_FCP_RESPONSE 0xfffff0000d00ull + +static const char * const ctype_names[] = { + [0x0] = "control", [0x8] = "not implemented", + [0x1] = "status", [0x9] = "accepted", + [0x2] = "specific inquiry", [0xa] = "rejected", + [0x3] = "notify", [0xb] = "in transition", + [0x4] = "general inquiry", [0xc] = "stable", + [0x5] = "(reserved 0x05)", [0xd] = "changed", + [0x6] = "(reserved 0x06)", [0xe] = "(reserved 0x0e)", + [0x7] = "(reserved 0x07)", [0xf] = "interim", +}; + +static const char * const subunit_type_names[] = { + [0x00] = "monitor", [0x10] = "(reserved 0x10)", + [0x01] = "audio", [0x11] = "(reserved 0x11)", + [0x02] = "printer", [0x12] = "(reserved 0x12)", + [0x03] = "disc", [0x13] = "(reserved 0x13)", + [0x04] = "tape recorder/player",[0x14] = "(reserved 0x14)", + [0x05] = "tuner", [0x15] = "(reserved 0x15)", + [0x06] = "ca", [0x16] = "(reserved 0x16)", + [0x07] = "camera", [0x17] = "(reserved 0x17)", + [0x08] = "(reserved 0x08)", [0x18] = "(reserved 0x18)", + [0x09] = "panel", [0x19] = "(reserved 0x19)", + [0x0a] = "bulletin board", [0x1a] = "(reserved 0x1a)", + [0x0b] = "camera storage", [0x1b] = "(reserved 0x1b)", + [0x0c] = "(reserved 0x0c)", [0x1c] = "vendor unique", + [0x0d] = "(reserved 0x0d)", [0x1d] = "all subunit types", + [0x0e] = "(reserved 0x0e)", [0x1e] = "subunit_type extended to next byte", + [0x0f] = "(reserved 0x0f)", [0x1f] = "unit", +}; + +struct avc_enum { + int value; + const char *name; +}; + +struct avc_field { + const char *name; /* Short name for field. */ + int offset; /* Location of field, specified in bits; */ + /* negative means from end of packet. */ + int width; /* Width of field, 0 means use data_length. */ + struct avc_enum *names; +}; + +struct avc_opcode_info { + const char *name; + struct avc_field fields[8]; +}; + +struct avc_enum power_field_names[] = { + { 0x70, "on" }, + { 0x60, "off" }, + { } +}; + +static const struct avc_opcode_info opcode_info[256] = { + + /* TA Document 1999026 */ + /* AV/C Digital Interface Command Set General Specification 4.0 */ + [0xb2] = { "power", { + { "state", 0, 8, power_field_names } + } + }, + [0x30] = { "unit info", { + { "foo", 0, 8 }, + { "unit_type", 8, 5 }, + { "unit", 13, 3 }, + { "company id", 16, 24 }, + } + }, + [0x31] = { "subunit info" }, + [0x01] = { "reserve" }, + [0xb0] = { "version" }, + [0x00] = { "vendor dependent" }, + [0x02] = { "plug info" }, + [0x12] = { "channel usage" }, + [0x24] = { "connect" }, + [0x20] = { "connect av" }, + [0x22] = { "connections" }, + [0x11] = { "digital input" }, + [0x10] = { "digital output" }, + [0x25] = { "disconnect" }, + [0x21] = { "disconnect av" }, + [0x19] = { "input plug signal format" }, + [0x18] = { "output plug signal format" }, + [0x1f] = { "general bus setup" }, + + /* TA Document 1999025 */ + /* AV/C Descriptor Mechanism Specification Version 1.0 */ + [0x0c] = { "create descriptor" }, + [0x08] = { "open descriptor" }, + [0x09] = { "read descriptor" }, + [0x0a] = { "write descriptor" }, + [0x05] = { "open info block" }, + [0x06] = { "read info block" }, + [0x07] = { "write info block" }, + [0x0b] = { "search descriptor" }, + [0x0d] = { "object number select" }, + + /* TA Document 1999015 */ + /* AV/C Command Set for Rate Control of Isochronous Data Flow 1.0 */ + [0xb3] = { "rate", { + { "subfunction", 0, 8 }, + { "result", 8, 8 }, + { "plug_type", 16, 8 }, + { "plug_id", 16, 8 }, + } + }, + + /* TA Document 1999008 */ + /* AV/C Audio Subunit Specification 1.0 */ + [0xb8] = { "function block" }, + + /* TA Document 2001001 */ + /* AV/C Panel Subunit Specification 1.1 */ + [0x7d] = { "gui update" }, + [0x7e] = { "push gui data" }, + [0x7f] = { "user action" }, + [0x7c] = { "pass through" }, + + /* */ + [0x26] = { "asynchronous connection" }, +}; + +struct avc_frame { + uint32_t operand0:8; + uint32_t opcode:8; + uint32_t subunit_id:3; + uint32_t subunit_type:5; + uint32_t ctype:4; + uint32_t cts:4; +}; + +static void +decode_avc(struct link_transaction *t) +{ + struct avc_frame *frame = + (struct avc_frame *) t->request->packet.write_block.data; + const struct avc_opcode_info *info; + const char *name; + char buffer[32]; + int i; + + info = &opcode_info[frame->opcode]; + if (info->name == NULL) { + snprintf(buffer, sizeof(buffer), + "(unknown opcode 0x%02x)", frame->opcode); + name = buffer; + } else { + name = info->name; + } + + printf("av/c %s, subunit_type=%s, subunit_id=%d, opcode=%s", + ctype_names[frame->ctype], subunit_type_names[frame->subunit_type], + frame->subunit_id, name); + + for (i = 0; info->fields[i].name != NULL; i++) + printf(", %s", info->fields[i].name); + + printf("\n"); +} + +int +decode_fcp(struct link_transaction *t) +{ + struct avc_frame *frame = + (struct avc_frame *) t->request->packet.write_block.data; + unsigned long long offset = + ((unsigned long long) t->request->packet.common.offset_high << 32) | + t->request->packet.common.offset_low; + + if (t->request->packet.common.tcode != TCODE_WRITE_BLOCK_REQUEST) + return 0; + + if (offset == CSR_FCP_COMMAND || offset == CSR_FCP_RESPONSE) { + switch (frame->cts) { + case 0x00: + decode_avc(t); + break; + case 0x01: + printf("cal fcp frame (cts=0x01)\n"); + break; + case 0x02: + printf("ehs fcp frame (cts=0x02)\n"); + break; + case 0x03: + printf("havi fcp frame (cts=0x03)\n"); + break; + case 0x0e: + printf("vendor specific fcp frame (cts=0x0e)\n"); + break; + case 0x0f: + printf("extended cts\n"); + break; + default: + printf("reserved fcp frame (ctx=0x%02x)\n", frame->cts); + break; + } + return 1; + } + + return 0; +} + diff --git a/tools/firewire/list.h b/tools/firewire/list.h new file mode 100644 index 00000000..41f4bdad --- /dev/null +++ b/tools/firewire/list.h @@ -0,0 +1,62 @@ +struct list { + struct list *next, *prev; +}; + +static inline void +list_init(struct list *list) +{ + list->next = list; + list->prev = list; +} + +static inline int +list_empty(struct list *list) +{ + return list->next == list; +} + +static inline void +list_insert(struct list *link, struct list *new_link) +{ + new_link->prev = link->prev; + new_link->next = link; + new_link->prev->next = new_link; + new_link->next->prev = new_link; +} + +static inline void +list_append(struct list *list, struct list *new_link) +{ + list_insert((struct list *)list, new_link); +} + +static inline void +list_prepend(struct list *list, struct list *new_link) +{ + list_insert(list->next, new_link); +} + +static inline void +list_remove(struct list *link) +{ + link->prev->next = link->next; + link->next->prev = link->prev; +} + +#define list_entry(link, type, member) \ + ((type *)((char *)(link)-(unsigned long)(&((type *)0)->member))) + +#define list_head(list, type, member) \ + list_entry((list)->next, type, member) + +#define list_tail(list, type, member) \ + list_entry((list)->prev, type, member) + +#define list_next(elm, member) \ + list_entry((elm)->member.next, typeof(*elm), member) + +#define list_for_each_entry(pos, list, member) \ + for (pos = list_head(list, typeof(*pos), member); \ + &pos->member != (list); \ + pos = list_next(pos, member)) + diff --git a/tools/firewire/nosy-dump.c b/tools/firewire/nosy-dump.c new file mode 100644 index 00000000..3179c711 --- /dev/null +++ b/tools/firewire/nosy-dump.c @@ -0,0 +1,1035 @@ +/* + * nosy-dump - Interface to snoop mode driver for TI PCILynx 1394 controllers + * Copyright (C) 2002-2006 Kristian Høgsberg + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "list.h" +#include "nosy-dump.h" +#include "nosy-user.h" + +enum { + PACKET_FIELD_DETAIL = 0x01, + PACKET_FIELD_DATA_LENGTH = 0x02, + /* Marks the fields we print in transaction view. */ + PACKET_FIELD_TRANSACTION = 0x04, +}; + +static void print_packet(uint32_t *data, size_t length); +static void decode_link_packet(struct link_packet *packet, size_t length, + int include_flags, int exclude_flags); +static int run = 1; +sig_t sys_sigint_handler; + +static char *option_nosy_device = "/dev/nosy"; +static char *option_view = "packet"; +static char *option_output; +static char *option_input; +static int option_hex; +static int option_iso; +static int option_cycle_start; +static int option_version; +static int option_verbose; + +enum { + VIEW_TRANSACTION, + VIEW_PACKET, + VIEW_STATS, +}; + +static const struct poptOption options[] = { + { + .longName = "device", + .shortName = 'd', + .argInfo = POPT_ARG_STRING, + .arg = &option_nosy_device, + .descrip = "Path to nosy device.", + .argDescrip = "DEVICE" + }, + { + .longName = "view", + .argInfo = POPT_ARG_STRING, + .arg = &option_view, + .descrip = "Specify view of bus traffic: packet, transaction or stats.", + .argDescrip = "VIEW" + }, + { + .longName = "hex", + .shortName = 'x', + .argInfo = POPT_ARG_NONE, + .arg = &option_hex, + .descrip = "Print each packet in hex.", + }, + { + .longName = "iso", + .argInfo = POPT_ARG_NONE, + .arg = &option_iso, + .descrip = "Print iso packets.", + }, + { + .longName = "cycle-start", + .argInfo = POPT_ARG_NONE, + .arg = &option_cycle_start, + .descrip = "Print cycle start packets.", + }, + { + .longName = "verbose", + .shortName = 'v', + .argInfo = POPT_ARG_NONE, + .arg = &option_verbose, + .descrip = "Verbose packet view.", + }, + { + .longName = "output", + .shortName = 'o', + .argInfo = POPT_ARG_STRING, + .arg = &option_output, + .descrip = "Log to output file.", + .argDescrip = "FILENAME" + }, + { + .longName = "input", + .shortName = 'i', + .argInfo = POPT_ARG_STRING, + .arg = &option_input, + .descrip = "Decode log from file.", + .argDescrip = "FILENAME" + }, + { + .longName = "version", + .argInfo = POPT_ARG_NONE, + .arg = &option_version, + .descrip = "Specify print version info.", + }, + POPT_AUTOHELP + POPT_TABLEEND +}; + +/* Allow all ^C except the first to interrupt the program in the usual way. */ +static void +sigint_handler(int signal_num) +{ + if (run == 1) { + run = 0; + signal(SIGINT, SIG_DFL); + } +} + +static struct subaction * +subaction_create(uint32_t *data, size_t length) +{ + struct subaction *sa; + + /* we put the ack in the subaction struct for easy access. */ + sa = malloc(sizeof *sa - sizeof sa->packet + length); + if (!sa) + exit(EXIT_FAILURE); + sa->ack = data[length / 4 - 1]; + sa->length = length; + memcpy(&sa->packet, data, length); + + return sa; +} + +static void +subaction_destroy(struct subaction *sa) +{ + free(sa); +} + +static struct list pending_transaction_list = { + &pending_transaction_list, &pending_transaction_list +}; + +static struct link_transaction * +link_transaction_lookup(int request_node, int response_node, int tlabel) +{ + struct link_transaction *t; + + list_for_each_entry(t, &pending_transaction_list, link) { + if (t->request_node == request_node && + t->response_node == response_node && + t->tlabel == tlabel) + return t; + } + + t = malloc(sizeof *t); + if (!t) + exit(EXIT_FAILURE); + t->request_node = request_node; + t->response_node = response_node; + t->tlabel = tlabel; + list_init(&t->request_list); + list_init(&t->response_list); + + list_append(&pending_transaction_list, &t->link); + + return t; +} + +static void +link_transaction_destroy(struct link_transaction *t) +{ + struct subaction *sa; + + while (!list_empty(&t->request_list)) { + sa = list_head(&t->request_list, struct subaction, link); + list_remove(&sa->link); + subaction_destroy(sa); + } + while (!list_empty(&t->response_list)) { + sa = list_head(&t->response_list, struct subaction, link); + list_remove(&sa->link); + subaction_destroy(sa); + } + free(t); +} + +struct protocol_decoder { + const char *name; + int (*decode)(struct link_transaction *t); +}; + +static const struct protocol_decoder protocol_decoders[] = { + { "FCP", decode_fcp } +}; + +static void +handle_transaction(struct link_transaction *t) +{ + struct subaction *sa; + int i; + + if (!t->request) { + printf("BUG in handle_transaction\n"); + return; + } + + for (i = 0; i < array_length(protocol_decoders); i++) + if (protocol_decoders[i].decode(t)) + break; + + /* HACK: decode only fcp right now. */ + return; + + decode_link_packet(&t->request->packet, t->request->length, + PACKET_FIELD_TRANSACTION, 0); + if (t->response) + decode_link_packet(&t->response->packet, t->request->length, + PACKET_FIELD_TRANSACTION, 0); + else + printf("[no response]"); + + if (option_verbose) { + list_for_each_entry(sa, &t->request_list, link) + print_packet((uint32_t *) &sa->packet, sa->length); + list_for_each_entry(sa, &t->response_list, link) + print_packet((uint32_t *) &sa->packet, sa->length); + } + printf("\r\n"); + + link_transaction_destroy(t); +} + +static void +clear_pending_transaction_list(void) +{ + struct link_transaction *t; + + while (!list_empty(&pending_transaction_list)) { + t = list_head(&pending_transaction_list, + struct link_transaction, link); + list_remove(&t->link); + link_transaction_destroy(t); + /* print unfinished transactions */ + } +} + +static const char * const tcode_names[] = { + [0x0] = "write_quadlet_request", [0x6] = "read_quadlet_response", + [0x1] = "write_block_request", [0x7] = "read_block_response", + [0x2] = "write_response", [0x8] = "cycle_start", + [0x3] = "reserved", [0x9] = "lock_request", + [0x4] = "read_quadlet_request", [0xa] = "iso_data", + [0x5] = "read_block_request", [0xb] = "lock_response", +}; + +static const char * const ack_names[] = { + [0x0] = "no ack", [0x8] = "reserved (0x08)", + [0x1] = "ack_complete", [0x9] = "reserved (0x09)", + [0x2] = "ack_pending", [0xa] = "reserved (0x0a)", + [0x3] = "reserved (0x03)", [0xb] = "reserved (0x0b)", + [0x4] = "ack_busy_x", [0xc] = "reserved (0x0c)", + [0x5] = "ack_busy_a", [0xd] = "ack_data_error", + [0x6] = "ack_busy_b", [0xe] = "ack_type_error", + [0x7] = "reserved (0x07)", [0xf] = "reserved (0x0f)", +}; + +static const char * const rcode_names[] = { + [0x0] = "complete", [0x4] = "conflict_error", + [0x1] = "reserved (0x01)", [0x5] = "data_error", + [0x2] = "reserved (0x02)", [0x6] = "type_error", + [0x3] = "reserved (0x03)", [0x7] = "address_error", +}; + +static const char * const retry_names[] = { + [0x0] = "retry_1", + [0x1] = "retry_x", + [0x2] = "retry_a", + [0x3] = "retry_b", +}; + +enum { + PACKET_RESERVED, + PACKET_REQUEST, + PACKET_RESPONSE, + PACKET_OTHER, +}; + +struct packet_info { + const char *name; + int type; + int response_tcode; + const struct packet_field *fields; + int field_count; +}; + +struct packet_field { + const char *name; /* Short name for field. */ + int offset; /* Location of field, specified in bits; */ + /* negative means from end of packet. */ + int width; /* Width of field, 0 means use data_length. */ + int flags; /* Show options. */ + const char * const *value_names; +}; + +#define COMMON_REQUEST_FIELDS \ + { "dest", 0, 16, PACKET_FIELD_TRANSACTION }, \ + { "tl", 16, 6 }, \ + { "rt", 22, 2, PACKET_FIELD_DETAIL, retry_names }, \ + { "tcode", 24, 4, PACKET_FIELD_TRANSACTION, tcode_names }, \ + { "pri", 28, 4, PACKET_FIELD_DETAIL }, \ + { "src", 32, 16, PACKET_FIELD_TRANSACTION }, \ + { "offs", 48, 48, PACKET_FIELD_TRANSACTION } + +#define COMMON_RESPONSE_FIELDS \ + { "dest", 0, 16 }, \ + { "tl", 16, 6 }, \ + { "rt", 22, 2, PACKET_FIELD_DETAIL, retry_names }, \ + { "tcode", 24, 4, 0, tcode_names }, \ + { "pri", 28, 4, PACKET_FIELD_DETAIL }, \ + { "src", 32, 16 }, \ + { "rcode", 48, 4, PACKET_FIELD_TRANSACTION, rcode_names } + +static const struct packet_field read_quadlet_request_fields[] = { + COMMON_REQUEST_FIELDS, + { "crc", 96, 32, PACKET_FIELD_DETAIL }, + { "ack", 156, 4, 0, ack_names }, +}; + +static const struct packet_field read_quadlet_response_fields[] = { + COMMON_RESPONSE_FIELDS, + { "data", 96, 32, PACKET_FIELD_TRANSACTION }, + { "crc", 128, 32, PACKET_FIELD_DETAIL }, + { "ack", 188, 4, 0, ack_names }, +}; + +static const struct packet_field read_block_request_fields[] = { + COMMON_REQUEST_FIELDS, + { "data_length", 96, 16, PACKET_FIELD_TRANSACTION }, + { "extended_tcode", 112, 16 }, + { "crc", 128, 32, PACKET_FIELD_DETAIL }, + { "ack", 188, 4, 0, ack_names }, +}; + +static const struct packet_field block_response_fields[] = { + COMMON_RESPONSE_FIELDS, + { "data_length", 96, 16, PACKET_FIELD_DATA_LENGTH }, + { "extended_tcode", 112, 16 }, + { "crc", 128, 32, PACKET_FIELD_DETAIL }, + { "data", 160, 0, PACKET_FIELD_TRANSACTION }, + { "crc", -64, 32, PACKET_FIELD_DETAIL }, + { "ack", -4, 4, 0, ack_names }, +}; + +static const struct packet_field write_quadlet_request_fields[] = { + COMMON_REQUEST_FIELDS, + { "data", 96, 32, PACKET_FIELD_TRANSACTION }, + { "ack", -4, 4, 0, ack_names }, +}; + +static const struct packet_field block_request_fields[] = { + COMMON_REQUEST_FIELDS, + { "data_length", 96, 16, PACKET_FIELD_DATA_LENGTH | PACKET_FIELD_TRANSACTION }, + { "extended_tcode", 112, 16, PACKET_FIELD_TRANSACTION }, + { "crc", 128, 32, PACKET_FIELD_DETAIL }, + { "data", 160, 0, PACKET_FIELD_TRANSACTION }, + { "crc", -64, 32, PACKET_FIELD_DETAIL }, + { "ack", -4, 4, 0, ack_names }, +}; + +static const struct packet_field write_response_fields[] = { + COMMON_RESPONSE_FIELDS, + { "reserved", 64, 32, PACKET_FIELD_DETAIL }, + { "ack", -4, 4, 0, ack_names }, +}; + +static const struct packet_field iso_data_fields[] = { + { "data_length", 0, 16, PACKET_FIELD_DATA_LENGTH }, + { "tag", 16, 2 }, + { "channel", 18, 6 }, + { "tcode", 24, 4, 0, tcode_names }, + { "sy", 28, 4 }, + { "crc", 32, 32, PACKET_FIELD_DETAIL }, + { "data", 64, 0 }, + { "crc", -64, 32, PACKET_FIELD_DETAIL }, + { "ack", -4, 4, 0, ack_names }, +}; + +static const struct packet_info packet_info[] = { + { + .name = "write_quadlet_request", + .type = PACKET_REQUEST, + .response_tcode = TCODE_WRITE_RESPONSE, + .fields = write_quadlet_request_fields, + .field_count = array_length(write_quadlet_request_fields) + }, + { + .name = "write_block_request", + .type = PACKET_REQUEST, + .response_tcode = TCODE_WRITE_RESPONSE, + .fields = block_request_fields, + .field_count = array_length(block_request_fields) + }, + { + .name = "write_response", + .type = PACKET_RESPONSE, + .fields = write_response_fields, + .field_count = array_length(write_response_fields) + }, + { + .name = "reserved", + .type = PACKET_RESERVED, + }, + { + .name = "read_quadlet_request", + .type = PACKET_REQUEST, + .response_tcode = TCODE_READ_QUADLET_RESPONSE, + .fields = read_quadlet_request_fields, + .field_count = array_length(read_quadlet_request_fields) + }, + { + .name = "read_block_request", + .type = PACKET_REQUEST, + .response_tcode = TCODE_READ_BLOCK_RESPONSE, + .fields = read_block_request_fields, + .field_count = array_length(read_block_request_fields) + }, + { + .name = "read_quadlet_response", + .type = PACKET_RESPONSE, + .fields = read_quadlet_response_fields, + .field_count = array_length(read_quadlet_response_fields) + }, + { + .name = "read_block_response", + .type = PACKET_RESPONSE, + .fields = block_response_fields, + .field_count = array_length(block_response_fields) + }, + { + .name = "cycle_start", + .type = PACKET_OTHER, + .fields = write_quadlet_request_fields, + .field_count = array_length(write_quadlet_request_fields) + }, + { + .name = "lock_request", + .type = PACKET_REQUEST, + .fields = block_request_fields, + .field_count = array_length(block_request_fields) + }, + { + .name = "iso_data", + .type = PACKET_OTHER, + .fields = iso_data_fields, + .field_count = array_length(iso_data_fields) + }, + { + .name = "lock_response", + .type = PACKET_RESPONSE, + .fields = block_response_fields, + .field_count = array_length(block_response_fields) + }, +}; + +static int +handle_request_packet(uint32_t *data, size_t length) +{ + struct link_packet *p = (struct link_packet *) data; + struct subaction *sa, *prev; + struct link_transaction *t; + + t = link_transaction_lookup(p->common.source, p->common.destination, + p->common.tlabel); + sa = subaction_create(data, length); + t->request = sa; + + if (!list_empty(&t->request_list)) { + prev = list_tail(&t->request_list, + struct subaction, link); + + if (!ACK_BUSY(prev->ack)) { + /* + * error, we should only see ack_busy_* before the + * ack_pending/ack_complete -- this is an ack_pending + * instead (ack_complete would have finished the + * transaction). + */ + } + + if (prev->packet.common.tcode != sa->packet.common.tcode || + prev->packet.common.tlabel != sa->packet.common.tlabel) { + /* memcmp() ? */ + /* error, these should match for retries. */ + } + } + + list_append(&t->request_list, &sa->link); + + switch (sa->ack) { + case ACK_COMPLETE: + if (p->common.tcode != TCODE_WRITE_QUADLET_REQUEST && + p->common.tcode != TCODE_WRITE_BLOCK_REQUEST) + /* error, unified transactions only allowed for write */; + list_remove(&t->link); + handle_transaction(t); + break; + + case ACK_NO_ACK: + case ACK_DATA_ERROR: + case ACK_TYPE_ERROR: + list_remove(&t->link); + handle_transaction(t); + break; + + case ACK_PENDING: + /* request subaction phase over, wait for response. */ + break; + + case ACK_BUSY_X: + case ACK_BUSY_A: + case ACK_BUSY_B: + /* ok, wait for retry. */ + /* check that retry protocol is respected. */ + break; + } + + return 1; +} + +static int +handle_response_packet(uint32_t *data, size_t length) +{ + struct link_packet *p = (struct link_packet *) data; + struct subaction *sa, *prev; + struct link_transaction *t; + + t = link_transaction_lookup(p->common.destination, p->common.source, + p->common.tlabel); + if (list_empty(&t->request_list)) { + /* unsolicited response */ + } + + sa = subaction_create(data, length); + t->response = sa; + + if (!list_empty(&t->response_list)) { + prev = list_tail(&t->response_list, struct subaction, link); + + if (!ACK_BUSY(prev->ack)) { + /* + * error, we should only see ack_busy_* before the + * ack_pending/ack_complete + */ + } + + if (prev->packet.common.tcode != sa->packet.common.tcode || + prev->packet.common.tlabel != sa->packet.common.tlabel) { + /* use memcmp() instead? */ + /* error, these should match for retries. */ + } + } else { + prev = list_tail(&t->request_list, struct subaction, link); + if (prev->ack != ACK_PENDING) { + /* + * error, should not get response unless last request got + * ack_pending. + */ + } + + if (packet_info[prev->packet.common.tcode].response_tcode != + sa->packet.common.tcode) { + /* error, tcode mismatch */ + } + } + + list_append(&t->response_list, &sa->link); + + switch (sa->ack) { + case ACK_COMPLETE: + case ACK_NO_ACK: + case ACK_DATA_ERROR: + case ACK_TYPE_ERROR: + list_remove(&t->link); + handle_transaction(t); + /* transaction complete, remove t from pending list. */ + break; + + case ACK_PENDING: + /* error for responses. */ + break; + + case ACK_BUSY_X: + case ACK_BUSY_A: + case ACK_BUSY_B: + /* no problem, wait for next retry */ + break; + } + + return 1; +} + +static int +handle_packet(uint32_t *data, size_t length) +{ + if (length == 0) { + printf("bus reset\r\n"); + clear_pending_transaction_list(); + } else if (length > sizeof(struct phy_packet)) { + struct link_packet *p = (struct link_packet *) data; + + switch (packet_info[p->common.tcode].type) { + case PACKET_REQUEST: + return handle_request_packet(data, length); + + case PACKET_RESPONSE: + return handle_response_packet(data, length); + + case PACKET_OTHER: + case PACKET_RESERVED: + return 0; + } + } + + return 1; +} + +static unsigned int +get_bits(struct link_packet *packet, int offset, int width) +{ + uint32_t *data = (uint32_t *) packet; + uint32_t index, shift, mask; + + index = offset / 32 + 1; + shift = 32 - (offset & 31) - width; + mask = width == 32 ? ~0 : (1 << width) - 1; + + return (data[index] >> shift) & mask; +} + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define byte_index(i) ((i) ^ 3) +#elif __BYTE_ORDER == __BIG_ENDIAN +#define byte_index(i) (i) +#else +#error unsupported byte order. +#endif + +static void +dump_data(unsigned char *data, int length) +{ + int i, print_length; + + if (length > 128) + print_length = 128; + else + print_length = length; + + for (i = 0; i < print_length; i++) + printf("%s%02hhx", + (i % 4 == 0 && i != 0) ? " " : "", + data[byte_index(i)]); + + if (print_length < length) + printf(" (%d more bytes)", length - print_length); +} + +static void +decode_link_packet(struct link_packet *packet, size_t length, + int include_flags, int exclude_flags) +{ + const struct packet_info *pi; + int data_length = 0; + int i; + + pi = &packet_info[packet->common.tcode]; + + for (i = 0; i < pi->field_count; i++) { + const struct packet_field *f = &pi->fields[i]; + int offset; + + if (f->flags & exclude_flags) + continue; + if (include_flags && !(f->flags & include_flags)) + continue; + + if (f->offset < 0) + offset = length * 8 + f->offset - 32; + else + offset = f->offset; + + if (f->value_names != NULL) { + uint32_t bits; + + bits = get_bits(packet, offset, f->width); + printf("%s", f->value_names[bits]); + } else if (f->width == 0) { + printf("%s=[", f->name); + dump_data((unsigned char *) packet + (offset / 8 + 4), data_length); + printf("]"); + } else { + unsigned long long bits; + int high_width, low_width; + + if ((offset & ~31) != ((offset + f->width - 1) & ~31)) { + /* Bit field spans quadlet boundary. */ + high_width = ((offset + 31) & ~31) - offset; + low_width = f->width - high_width; + + bits = get_bits(packet, offset, high_width); + bits = (bits << low_width) | + get_bits(packet, offset + high_width, low_width); + } else { + bits = get_bits(packet, offset, f->width); + } + + printf("%s=0x%0*llx", f->name, (f->width + 3) / 4, bits); + + if (f->flags & PACKET_FIELD_DATA_LENGTH) + data_length = bits; + } + + if (i < pi->field_count - 1) + printf(", "); + } +} + +static void +print_packet(uint32_t *data, size_t length) +{ + int i; + + printf("%6u ", data[0]); + + if (length == 4) { + printf("bus reset"); + } else if (length < sizeof(struct phy_packet)) { + printf("short packet: "); + for (i = 1; i < length / 4; i++) + printf("%s%08x", i == 0 ? "[" : " ", data[i]); + printf("]"); + + } else if (length == sizeof(struct phy_packet) && data[1] == ~data[2]) { + struct phy_packet *pp = (struct phy_packet *) data; + + /* phy packet are 3 quadlets: the 1 quadlet payload, + * the bitwise inverse of the payload and the snoop + * mode ack */ + + switch (pp->common.identifier) { + case PHY_PACKET_CONFIGURATION: + if (!pp->phy_config.set_root && !pp->phy_config.set_gap_count) { + printf("ext phy config: phy_id=%02x", pp->phy_config.root_id); + } else { + printf("phy config:"); + if (pp->phy_config.set_root) + printf(" set_root_id=%02x", pp->phy_config.root_id); + if (pp->phy_config.set_gap_count) + printf(" set_gap_count=%d", pp->phy_config.gap_count); + } + break; + + case PHY_PACKET_LINK_ON: + printf("link-on packet, phy_id=%02x", pp->link_on.phy_id); + break; + + case PHY_PACKET_SELF_ID: + if (pp->self_id.extended) { + printf("extended self id: phy_id=%02x, seq=%d", + pp->ext_self_id.phy_id, pp->ext_self_id.sequence); + } else { + static const char * const speed_names[] = { + "S100", "S200", "S400", "BETA" + }; + printf("self id: phy_id=%02x, link %s, gap_count=%d, speed=%s%s%s", + pp->self_id.phy_id, + (pp->self_id.link_active ? "active" : "not active"), + pp->self_id.gap_count, + speed_names[pp->self_id.phy_speed], + (pp->self_id.contender ? ", irm contender" : ""), + (pp->self_id.initiated_reset ? ", initiator" : "")); + } + break; + default: + printf("unknown phy packet: "); + for (i = 1; i < length / 4; i++) + printf("%s%08x", i == 0 ? "[" : " ", data[i]); + printf("]"); + break; + } + } else { + struct link_packet *packet = (struct link_packet *) data; + + decode_link_packet(packet, length, 0, + option_verbose ? 0 : PACKET_FIELD_DETAIL); + } + + if (option_hex) { + printf(" ["); + dump_data((unsigned char *) data + 4, length - 4); + printf("]"); + } + + printf("\r\n"); +} + +#define HIDE_CURSOR "\033[?25l" +#define SHOW_CURSOR "\033[?25h" +#define CLEAR "\033[H\033[2J" + +static void +print_stats(uint32_t *data, size_t length) +{ + static int bus_reset_count, short_packet_count, phy_packet_count; + static int tcode_count[16]; + static struct timeval last_update; + struct timeval now; + int i; + + if (length == 0) + bus_reset_count++; + else if (length < sizeof(struct phy_packet)) + short_packet_count++; + else if (length == sizeof(struct phy_packet) && data[1] == ~data[2]) + phy_packet_count++; + else { + struct link_packet *packet = (struct link_packet *) data; + tcode_count[packet->common.tcode]++; + } + + gettimeofday(&now, NULL); + if (now.tv_sec <= last_update.tv_sec && + now.tv_usec < last_update.tv_usec + 500000) + return; + + last_update = now; + printf(CLEAR HIDE_CURSOR + " bus resets : %8d\n" + " short packets : %8d\n" + " phy packets : %8d\n", + bus_reset_count, short_packet_count, phy_packet_count); + + for (i = 0; i < array_length(packet_info); i++) + if (packet_info[i].type != PACKET_RESERVED) + printf(" %-24s: %8d\n", packet_info[i].name, tcode_count[i]); + printf(SHOW_CURSOR "\n"); +} + +static struct termios saved_attributes; + +static void +reset_input_mode(void) +{ + tcsetattr(STDIN_FILENO, TCSANOW, &saved_attributes); +} + +static void +set_input_mode(void) +{ + struct termios tattr; + + /* Make sure stdin is a terminal. */ + if (!isatty(STDIN_FILENO)) { + fprintf(stderr, "Not a terminal.\n"); + exit(EXIT_FAILURE); + } + + /* Save the terminal attributes so we can restore them later. */ + tcgetattr(STDIN_FILENO, &saved_attributes); + atexit(reset_input_mode); + + /* Set the funny terminal modes. */ + tcgetattr(STDIN_FILENO, &tattr); + tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */ + tattr.c_cc[VMIN] = 1; + tattr.c_cc[VTIME] = 0; + tcsetattr(STDIN_FILENO, TCSAFLUSH, &tattr); +} + +int main(int argc, const char *argv[]) +{ + uint32_t buf[128 * 1024]; + uint32_t filter; + int length, retval, view; + int fd = -1; + FILE *output = NULL, *input = NULL; + poptContext con; + char c; + struct pollfd pollfds[2]; + + sys_sigint_handler = signal(SIGINT, sigint_handler); + + con = poptGetContext(NULL, argc, argv, options, 0); + retval = poptGetNextOpt(con); + if (retval < -1) { + poptPrintUsage(con, stdout, 0); + return -1; + } + + if (option_version) { + printf("dump tool for nosy sniffer, version %s\n", VERSION); + return 0; + } + + if (__BYTE_ORDER != __LITTLE_ENDIAN) + fprintf(stderr, "warning: nosy has only been tested on little " + "endian machines\n"); + + if (option_input != NULL) { + input = fopen(option_input, "r"); + if (input == NULL) { + fprintf(stderr, "Could not open %s, %m\n", option_input); + return -1; + } + } else { + fd = open(option_nosy_device, O_RDWR); + if (fd < 0) { + fprintf(stderr, "Could not open %s, %m\n", option_nosy_device); + return -1; + } + set_input_mode(); + } + + if (strcmp(option_view, "transaction") == 0) + view = VIEW_TRANSACTION; + else if (strcmp(option_view, "stats") == 0) + view = VIEW_STATS; + else + view = VIEW_PACKET; + + if (option_output) { + output = fopen(option_output, "w"); + if (output == NULL) { + fprintf(stderr, "Could not open %s, %m\n", option_output); + return -1; + } + } + + setvbuf(stdout, NULL, _IOLBF, BUFSIZ); + + filter = ~0; + if (!option_iso) + filter &= ~(1 << TCODE_STREAM_DATA); + if (!option_cycle_start) + filter &= ~(1 << TCODE_CYCLE_START); + if (view == VIEW_STATS) + filter = ~(1 << TCODE_CYCLE_START); + + ioctl(fd, NOSY_IOC_FILTER, filter); + + ioctl(fd, NOSY_IOC_START); + + pollfds[0].fd = fd; + pollfds[0].events = POLLIN; + pollfds[1].fd = STDIN_FILENO; + pollfds[1].events = POLLIN; + + while (run) { + if (input != NULL) { + if (fread(&length, sizeof length, 1, input) != 1) + return 0; + fread(buf, 1, length, input); + } else { + poll(pollfds, 2, -1); + if (pollfds[1].revents) { + read(STDIN_FILENO, &c, sizeof c); + switch (c) { + case 'q': + if (output != NULL) + fclose(output); + return 0; + } + } + + if (pollfds[0].revents) + length = read(fd, buf, sizeof buf); + else + continue; + } + + if (output != NULL) { + fwrite(&length, sizeof length, 1, output); + fwrite(buf, 1, length, output); + } + + switch (view) { + case VIEW_TRANSACTION: + handle_packet(buf, length); + break; + case VIEW_PACKET: + print_packet(buf, length); + break; + case VIEW_STATS: + print_stats(buf, length); + break; + } + } + + if (output != NULL) + fclose(output); + + close(fd); + + poptFreeContext(con); + + return 0; +} diff --git a/tools/firewire/nosy-dump.h b/tools/firewire/nosy-dump.h new file mode 100644 index 00000000..3a4b5b33 --- /dev/null +++ b/tools/firewire/nosy-dump.h @@ -0,0 +1,173 @@ +#ifndef __nosy_dump_h__ +#define __nosy_dump_h__ + +#define array_length(array) (sizeof(array) / sizeof(array[0])) + +#define ACK_NO_ACK 0x0 +#define ACK_DONE(a) ((a >> 2) == 0) +#define ACK_BUSY(a) ((a >> 2) == 1) +#define ACK_ERROR(a) ((a >> 2) == 3) + +#include + +struct phy_packet { + uint32_t timestamp; + union { + struct { + uint32_t zero:24; + uint32_t phy_id:6; + uint32_t identifier:2; + } common, link_on; + + struct { + uint32_t zero:16; + uint32_t gap_count:6; + uint32_t set_gap_count:1; + uint32_t set_root:1; + uint32_t root_id:6; + uint32_t identifier:2; + } phy_config; + + struct { + uint32_t more_packets:1; + uint32_t initiated_reset:1; + uint32_t port2:2; + uint32_t port1:2; + uint32_t port0:2; + uint32_t power_class:3; + uint32_t contender:1; + uint32_t phy_delay:2; + uint32_t phy_speed:2; + uint32_t gap_count:6; + uint32_t link_active:1; + uint32_t extended:1; + uint32_t phy_id:6; + uint32_t identifier:2; + } self_id; + + struct { + uint32_t more_packets:1; + uint32_t reserved1:1; + uint32_t porth:2; + uint32_t portg:2; + uint32_t portf:2; + uint32_t porte:2; + uint32_t portd:2; + uint32_t portc:2; + uint32_t portb:2; + uint32_t porta:2; + uint32_t reserved0:2; + uint32_t sequence:3; + uint32_t extended:1; + uint32_t phy_id:6; + uint32_t identifier:2; + } ext_self_id; + }; + uint32_t inverted; + uint32_t ack; +}; + +#define TCODE_PHY_PACKET 0x10 + +#define PHY_PACKET_CONFIGURATION 0x00 +#define PHY_PACKET_LINK_ON 0x01 +#define PHY_PACKET_SELF_ID 0x02 + +struct link_packet { + uint32_t timestamp; + union { + struct { + uint32_t priority:4; + uint32_t tcode:4; + uint32_t rt:2; + uint32_t tlabel:6; + uint32_t destination:16; + + uint32_t offset_high:16; + uint32_t source:16; + + uint32_t offset_low; + } common; + + struct { + uint32_t common[3]; + uint32_t crc; + } read_quadlet; + + struct { + uint32_t common[3]; + uint32_t data; + uint32_t crc; + } read_quadlet_response; + + struct { + uint32_t common[3]; + uint32_t extended_tcode:16; + uint32_t data_length:16; + uint32_t crc; + } read_block; + + struct { + uint32_t common[3]; + uint32_t extended_tcode:16; + uint32_t data_length:16; + uint32_t crc; + uint32_t data[0]; + /* crc and ack follows. */ + } read_block_response; + + struct { + uint32_t common[3]; + uint32_t data; + uint32_t crc; + } write_quadlet; + + struct { + uint32_t common[3]; + uint32_t extended_tcode:16; + uint32_t data_length:16; + uint32_t crc; + uint32_t data[0]; + /* crc and ack follows. */ + } write_block; + + struct { + uint32_t common[3]; + uint32_t crc; + } write_response; + + struct { + uint32_t common[3]; + uint32_t data; + uint32_t crc; + } cycle_start; + + struct { + uint32_t sy:4; + uint32_t tcode:4; + uint32_t channel:6; + uint32_t tag:2; + uint32_t data_length:16; + + uint32_t crc; + } iso_data; + }; +}; + +struct subaction { + uint32_t ack; + size_t length; + struct list link; + struct link_packet packet; +}; + +struct link_transaction { + int request_node, response_node, tlabel; + struct subaction *request, *response; + struct list request_list, response_list; + struct list link; +}; + +int decode_fcp(struct link_transaction *t); + +#endif /* __nosy_dump_h__ */ diff --git a/tools/gator/daemon/Android.mk b/tools/gator/daemon/Android.mk new file mode 100644 index 00000000..970ac694 --- /dev/null +++ b/tools/gator/daemon/Android.mk @@ -0,0 +1,76 @@ +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +XML_H := $(shell cd $(LOCAL_PATH) && make events_xml.h defaults_xml.h) + +LOCAL_SRC_FILES := \ + AnnotateListener.cpp \ + Buffer.cpp \ + CCNDriver.cpp \ + CPUFreqDriver.cpp \ + CapturedXML.cpp \ + Child.cpp \ + Command.cpp \ + ConfigurationXML.cpp \ + DiskIODriver.cpp \ + Driver.cpp \ + DriverSource.cpp \ + DynBuf.cpp \ + EventsXML.cpp \ + ExternalSource.cpp \ + FSDriver.cpp \ + Fifo.cpp \ + FtraceDriver.cpp \ + FtraceSource.cpp \ + HwmonDriver.cpp \ + KMod.cpp \ + LocalCapture.cpp \ + Logging.cpp \ + main.cpp \ + MaliVideoDriver.cpp \ + MemInfoDriver.cpp\ + Monitor.cpp \ + NetDriver.cpp \ + OlySocket.cpp \ + OlyUtility.cpp \ + PerfBuffer.cpp \ + PerfDriver.cpp \ + PerfGroup.cpp \ + PerfSource.cpp \ + Proc.cpp \ + Sender.cpp \ + SessionData.cpp \ + SessionXML.cpp \ + Setup.cpp \ + Source.cpp \ + StreamlineSetup.cpp \ + UEvent.cpp \ + UserSpaceSource.cpp \ + libsensors/access.c \ + libsensors/conf-lex.c \ + libsensors/conf-parse.c \ + libsensors/data.c \ + libsensors/error.c \ + libsensors/general.c \ + libsensors/init.c \ + libsensors/sysfs.c \ + mxml/mxml-attr.c \ + mxml/mxml-entity.c \ + mxml/mxml-file.c \ + mxml/mxml-get.c \ + mxml/mxml-index.c \ + mxml/mxml-node.c \ + mxml/mxml-private.c \ + mxml/mxml-search.c \ + mxml/mxml-set.c \ + mxml/mxml-string.c + +LOCAL_CFLAGS += -Wall -O3 -fno-exceptions -pthread -DETCDIR=\"/etc\" -Ilibsensors -fPIE +LOCAL_LDFLAGS += -fPIE -pie + +LOCAL_C_INCLUDES := $(LOCAL_PATH) + +LOCAL_MODULE := gatord +LOCAL_MODULE_TAGS := optional + +include $(BUILD_EXECUTABLE) diff --git a/tools/gator/daemon/AnnotateListener.cpp b/tools/gator/daemon/AnnotateListener.cpp new file mode 100644 index 00000000..50110b4d --- /dev/null +++ b/tools/gator/daemon/AnnotateListener.cpp @@ -0,0 +1,69 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "AnnotateListener.h" + +#include + +#include "OlySocket.h" + +struct AnnotateClient { + AnnotateClient *next; + int fd; +}; + +AnnotateListener::AnnotateListener() : mClients(NULL), mSock(NULL) { +} + +AnnotateListener::~AnnotateListener() { + close(); + delete mSock; +} + +void AnnotateListener::setup() { + mSock = new OlyServerSocket(8082); +} + +int AnnotateListener::getFd() { + return mSock->getFd(); +} + +void AnnotateListener::handle() { + AnnotateClient *const client = new AnnotateClient(); + client->fd = mSock->acceptConnection(); + client->next = mClients; + mClients = client; +} + +void AnnotateListener::close() { + mSock->closeServerSocket(); + while (mClients != NULL) { + ::close(mClients->fd); + AnnotateClient *next = mClients->next; + delete mClients; + mClients = next; + } +} + +void AnnotateListener::signal() { + const char ch = 0; + AnnotateClient **ptr = &mClients; + AnnotateClient *client = mClients; + while (client != NULL) { + if (write(client->fd, &ch, sizeof(ch)) != 1) { + ::close(client->fd); + AnnotateClient *next = client->next; + delete client; + *ptr = next; + client = next; + continue; + } + ptr = &client->next; + client = client->next; + } +} diff --git a/tools/gator/daemon/AnnotateListener.h b/tools/gator/daemon/AnnotateListener.h new file mode 100644 index 00000000..cdefef12 --- /dev/null +++ b/tools/gator/daemon/AnnotateListener.h @@ -0,0 +1,31 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +class AnnotateClient; +class OlyServerSocket; + +class AnnotateListener { +public: + AnnotateListener(); + ~AnnotateListener(); + + void setup(); + int getFd(); + + void handle(); + void close(); + void signal(); + +private: + AnnotateClient *mClients; + OlyServerSocket *mSock; + + // Intentionally unimplemented + AnnotateListener(const AnnotateListener &); + AnnotateListener &operator=(const AnnotateListener &); +}; diff --git a/tools/gator/daemon/Application.mk b/tools/gator/daemon/Application.mk new file mode 100644 index 00000000..3ada471c --- /dev/null +++ b/tools/gator/daemon/Application.mk @@ -0,0 +1,3 @@ +APP_PLATFORM := android-8 +# Replace armeabi-v7a with arm64-v8a to build an arm64 gatord or with armeabi to build an ARM11 gatord +APP_ABI := armeabi-v7a diff --git a/tools/gator/daemon/Buffer.cpp b/tools/gator/daemon/Buffer.cpp new file mode 100644 index 00000000..8fa62801 --- /dev/null +++ b/tools/gator/daemon/Buffer.cpp @@ -0,0 +1,428 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Buffer.h" + +#include "Logging.h" +#include "Sender.h" +#include "SessionData.h" + +#define mask (mSize - 1) + +enum { + CODE_PEA = 1, + CODE_KEYS = 2, + CODE_FORMAT = 3, + CODE_MAPS = 4, + CODE_COMM = 5, + CODE_KEYS_OLD = 6, + CODE_ONLINE_CPU = 7, + CODE_OFFLINE_CPU = 8, + CODE_KALLSYMS = 9, +}; + +// Summary Frame Messages +enum { + MESSAGE_SUMMARY = 1, + MESSAGE_CORE_NAME = 3, +}; + +// From gator_marshaling.c +#define NEWLINE_CANARY \ + /* Unix */ \ + "1\n" \ + /* Windows */ \ + "2\r\n" \ + /* Mac OS */ \ + "3\r" \ + /* RISC OS */ \ + "4\n\r" \ + /* Add another character so the length isn't 0x0a bytes */ \ + "5" + +Buffer::Buffer(const int32_t core, const int32_t buftype, const int size, sem_t *const readerSem) : mBuf(new char[size]), mReaderSem(readerSem), mCommitTime(gSessionData->mLiveRate), mSize(size), mReadPos(0), mWritePos(0), mCommitPos(0), mAvailable(true), mIsDone(false), mCore(core), mBufType(buftype) { + if ((mSize & mask) != 0) { + logg->logError(__FILE__, __LINE__, "Buffer size is not a power of 2"); + handleException(); + } + sem_init(&mWriterSem, 0, 0); + frame(); +} + +Buffer::~Buffer() { + delete [] mBuf; + sem_destroy(&mWriterSem); +} + +void Buffer::write(Sender *const sender) { + if (!commitReady()) { + return; + } + + // commit and read are updated by the writer, only read them once + int commitPos = mCommitPos; + int readPos = mReadPos; + + // determine the size of two halves + int length1 = commitPos - readPos; + char *buffer1 = mBuf + readPos; + int length2 = 0; + char *buffer2 = mBuf; + if (length1 < 0) { + length1 = mSize - readPos; + length2 = commitPos; + } + + logg->logMessage("Sending data length1: %i length2: %i", length1, length2); + + // start, middle or end + if (length1 > 0) { + sender->writeData(buffer1, length1, RESPONSE_APC_DATA); + } + + // possible wrap around + if (length2 > 0) { + sender->writeData(buffer2, length2, RESPONSE_APC_DATA); + } + + mReadPos = commitPos; + + // send a notification that space is available + sem_post(&mWriterSem); +} + +bool Buffer::commitReady() const { + return mCommitPos != mReadPos; +} + +int Buffer::bytesAvailable() const { + int filled = mWritePos - mReadPos; + if (filled < 0) { + filled += mSize; + } + + int remaining = mSize - filled; + + if (mAvailable) { + // Give some extra room; also allows space to insert the overflow error packet + remaining -= 200; + } else { + // Hysteresis, prevents multiple overflow messages + remaining -= 2000; + } + + return remaining; +} + +bool Buffer::checkSpace(const int bytes) { + const int remaining = bytesAvailable(); + + if (remaining < bytes) { + mAvailable = false; + } else { + mAvailable = true; + } + + return mAvailable; +} + +int Buffer::contiguousSpaceAvailable() const { + int remaining = bytesAvailable(); + int contiguous = mSize - mWritePos; + if (remaining < contiguous) { + return remaining; + } else { + return contiguous; + } +} + +void Buffer::commit(const uint64_t time) { + // post-populate the length, which does not include the response type length nor the length itself, i.e. only the length of the payload + const int typeLength = gSessionData->mLocalCapture ? 0 : 1; + int length = mWritePos - mCommitPos; + if (length < 0) { + length += mSize; + } + length = length - typeLength - sizeof(int32_t); + for (size_t byte = 0; byte < sizeof(int32_t); byte++) { + mBuf[(mCommitPos + typeLength + byte) & mask] = (length >> byte * 8) & 0xFF; + } + + logg->logMessage("Committing data mReadPos: %i mWritePos: %i mCommitPos: %i", mReadPos, mWritePos, mCommitPos); + mCommitPos = mWritePos; + + if (gSessionData->mLiveRate > 0) { + while (time > mCommitTime) { + mCommitTime += gSessionData->mLiveRate; + } + } + + if (!mIsDone) { + frame(); + } + + // send a notification that data is ready + sem_post(mReaderSem); +} + +void Buffer::check(const uint64_t time) { + int filled = mWritePos - mCommitPos; + if (filled < 0) { + filled += mSize; + } + if (filled >= ((mSize * 3) / 4) || (gSessionData->mLiveRate > 0 && time >= mCommitTime)) { + commit(time); + } +} + +void Buffer::packInt(char *const buf, const int size, int &writePos, int32_t x) { + int packedBytes = 0; + int more = true; + while (more) { + // low order 7 bits of x + char b = x & 0x7f; + x >>= 7; + + if ((x == 0 && (b & 0x40) == 0) || (x == -1 && (b & 0x40) != 0)) { + more = false; + } else { + b |= 0x80; + } + + buf[(writePos + packedBytes) & /*mask*/(size - 1)] = b; + packedBytes++; + } + + writePos = (writePos + packedBytes) & /*mask*/(size - 1); +} + +void Buffer::packInt(int32_t x) { + packInt(mBuf, mSize, mWritePos, x); +} + +void Buffer::packInt64(char *const buf, const int size, int &writePos, int64_t x) { + int packedBytes = 0; + int more = true; + while (more) { + // low order 7 bits of x + char b = x & 0x7f; + x >>= 7; + + if ((x == 0 && (b & 0x40) == 0) || (x == -1 && (b & 0x40) != 0)) { + more = false; + } else { + b |= 0x80; + } + + buf[(writePos + packedBytes) & /*mask*/(size - 1)] = b; + packedBytes++; + } + + writePos = (writePos + packedBytes) & /*mask*/(size - 1); +} + +void Buffer::packInt64(int64_t x) { + packInt64(mBuf, mSize, mWritePos, x); +} + +void Buffer::writeBytes(const void *const data, size_t count) { + size_t i; + for (i = 0; i < count; ++i) { + mBuf[(mWritePos + i) & mask] = static_cast(data)[i]; + } + + mWritePos = (mWritePos + i) & mask; +} + +void Buffer::writeString(const char *const str) { + const int len = strlen(str); + packInt(len); + writeBytes(str, len); +} + +void Buffer::frame() { + if (!gSessionData->mLocalCapture) { + packInt(RESPONSE_APC_DATA); + } + // Reserve space for the length + mWritePos += sizeof(int32_t); + packInt(mBufType); + if ((mBufType == FRAME_BLOCK_COUNTER) || (mBufType == FRAME_PERF_ATTRS) || (mBufType == FRAME_PERF)) { + packInt(mCore); + } +} + +void Buffer::summary(const uint64_t currTime, const int64_t timestamp, const int64_t uptime, const int64_t monotonicDelta, const char *const uname) { + packInt(MESSAGE_SUMMARY); + writeString(NEWLINE_CANARY); + packInt64(timestamp); + packInt64(uptime); + packInt64(monotonicDelta); + writeString("uname"); + writeString(uname); + writeString(""); + check(currTime); +} + +void Buffer::coreName(const uint64_t currTime, const int core, const int cpuid, const char *const name) { + if (checkSpace(3 * MAXSIZE_PACK32 + 0x100)) { + packInt(MESSAGE_CORE_NAME); + packInt(core); + packInt(cpuid); + writeString(name); + } + check(currTime); +} + +bool Buffer::eventHeader(const uint64_t curr_time) { + bool retval = false; + if (checkSpace(MAXSIZE_PACK32 + MAXSIZE_PACK64)) { + // key of zero indicates a timestamp + packInt(0); + packInt64(curr_time); + retval = true; + } + + return retval; +} + +bool Buffer::eventTid(const int tid) { + bool retval = false; + if (checkSpace(2 * MAXSIZE_PACK32)) { + // key of 1 indicates a tid + packInt(1); + packInt(tid); + retval = true; + } + + return retval; +} + +void Buffer::event(const int key, const int32_t value) { + if (checkSpace(2 * MAXSIZE_PACK32)) { + packInt(key); + packInt(value); + } +} + +void Buffer::event64(const int key, const int64_t value) { + if (checkSpace(MAXSIZE_PACK64 + MAXSIZE_PACK32)) { + packInt(key); + packInt64(value); + } +} + +void Buffer::pea(const uint64_t currTime, const struct perf_event_attr *const pea, int key) { + while (!checkSpace(2 * MAXSIZE_PACK32 + pea->size)) { + sem_wait(&mWriterSem); + } + packInt(CODE_PEA); + writeBytes(pea, pea->size); + packInt(key); + check(currTime); +} + +void Buffer::keys(const uint64_t currTime, const int count, const __u64 *const ids, const int *const keys) { + while (!checkSpace(2 * MAXSIZE_PACK32 + count * (MAXSIZE_PACK32 + MAXSIZE_PACK64))) { + sem_wait(&mWriterSem); + } + packInt(CODE_KEYS); + packInt(count); + for (int i = 0; i < count; ++i) { + packInt64(ids[i]); + packInt(keys[i]); + } + check(currTime); +} + +void Buffer::keysOld(const uint64_t currTime, const int keyCount, const int *const keys, const int bytes, const char *const buf) { + while (!checkSpace((2 + keyCount) * MAXSIZE_PACK32 + bytes)) { + sem_wait(&mWriterSem); + } + packInt(CODE_KEYS_OLD); + packInt(keyCount); + for (int i = 0; i < keyCount; ++i) { + packInt(keys[i]); + } + writeBytes(buf, bytes); + check(currTime); +} + +void Buffer::format(const uint64_t currTime, const int length, const char *const format) { + while (!checkSpace(MAXSIZE_PACK32 + length + 1)) { + sem_wait(&mWriterSem); + } + packInt(CODE_FORMAT); + writeBytes(format, length + 1); + check(currTime); +} + +void Buffer::maps(const uint64_t currTime, const int pid, const int tid, const char *const maps) { + const int mapsLen = strlen(maps) + 1; + while (!checkSpace(3 * MAXSIZE_PACK32 + mapsLen)) { + sem_wait(&mWriterSem); + } + packInt(CODE_MAPS); + packInt(pid); + packInt(tid); + writeBytes(maps, mapsLen); + check(currTime); +} + +void Buffer::comm(const uint64_t currTime, const int pid, const int tid, const char *const image, const char *const comm) { + const int imageLen = strlen(image) + 1; + const int commLen = strlen(comm) + 1; + while (!checkSpace(3 * MAXSIZE_PACK32 + imageLen + commLen)) { + sem_wait(&mWriterSem); + } + packInt(CODE_COMM); + packInt(pid); + packInt(tid); + writeBytes(image, imageLen); + writeBytes(comm, commLen); + check(currTime); +} + +void Buffer::onlineCPU(const uint64_t currTime, const uint64_t time, const int cpu) { + while (!checkSpace(MAXSIZE_PACK32 + MAXSIZE_PACK64)) { + sem_wait(&mWriterSem); + } + packInt(CODE_ONLINE_CPU); + packInt64(time); + packInt(cpu); + check(currTime); +} + +void Buffer::offlineCPU(const uint64_t currTime, const uint64_t time, const int cpu) { + while (!checkSpace(MAXSIZE_PACK32 + MAXSIZE_PACK64)) { + sem_wait(&mWriterSem); + } + packInt(CODE_OFFLINE_CPU); + packInt64(time); + packInt(cpu); + check(currTime); +} + +void Buffer::kallsyms(const uint64_t currTime, const char *const kallsyms) { + const int kallsymsLen = strlen(kallsyms) + 1; + while (!checkSpace(3 * MAXSIZE_PACK32 + kallsymsLen)) { + sem_wait(&mWriterSem); + } + packInt(CODE_KALLSYMS); + writeBytes(kallsyms, kallsymsLen); + check(currTime); +} + +void Buffer::setDone() { + mIsDone = true; + commit(0); +} + +bool Buffer::isDone() const { + return mIsDone && mReadPos == mCommitPos && mCommitPos == mWritePos; +} diff --git a/tools/gator/daemon/Buffer.h b/tools/gator/daemon/Buffer.h new file mode 100644 index 00000000..6cffd8e3 --- /dev/null +++ b/tools/gator/daemon/Buffer.h @@ -0,0 +1,106 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef BUFFER_H +#define BUFFER_H + +#include +#include + +#include "k/perf_event.h" + +class Sender; + +enum { + FRAME_SUMMARY = 1, + FRAME_BLOCK_COUNTER = 5, + FRAME_EXTERNAL = 10, + FRAME_PERF_ATTRS = 11, + FRAME_PERF = 12, +}; + +class Buffer { +public: + static const size_t MAXSIZE_PACK32 = 5; + static const size_t MAXSIZE_PACK64 = 10; + + Buffer(int32_t core, int32_t buftype, const int size, sem_t *const readerSem); + ~Buffer(); + + void write(Sender *sender); + + int bytesAvailable() const; + int contiguousSpaceAvailable() const; + void commit(const uint64_t time); + void check(const uint64_t time); + + // Summary messages + void summary(const uint64_t currTime, const int64_t timestamp, const int64_t uptime, const int64_t monotonicDelta, const char *const uname); + void coreName(const uint64_t currTime, const int core, const int cpuid, const char *const name); + + // Block Counter messages + bool eventHeader(uint64_t curr_time); + bool eventTid(int tid); + void event(int key, int32_t value); + void event64(int key, int64_t value); + + // Perf Attrs messages + void pea(const uint64_t currTime, const struct perf_event_attr *const pea, int key); + void keys(const uint64_t currTime, const int count, const __u64 *const ids, const int *const keys); + void keysOld(const uint64_t currTime, const int keyCount, const int *const keys, const int bytes, const char *const buf); + void format(const uint64_t currTime, const int length, const char *const format); + void maps(const uint64_t currTime, const int pid, const int tid, const char *const maps); + void comm(const uint64_t currTime, const int pid, const int tid, const char *const image, const char *const comm); + void onlineCPU(const uint64_t currTime, const uint64_t time, const int cpu); + void offlineCPU(const uint64_t currTime, const uint64_t time, const int cpu); + void kallsyms(const uint64_t currTime, const char *const kallsyms); + + void setDone(); + bool isDone() const; + + // Prefer a new member to using these functions if possible + char *getWritePos() { return mBuf + mWritePos; } + void advanceWrite(int bytes) { mWritePos = (mWritePos + bytes) & /*mask*/(mSize - 1); } + static void packInt(char *const buf, const int size, int &writePos, int32_t x); + void packInt(int32_t x); + static void packInt64(char *const buf, const int size, int &writePos, int64_t x); + void packInt64(int64_t x); + void writeBytes(const void *const data, size_t count); + void writeString(const char *const str); + + static void writeLEInt(unsigned char *buf, int v) { + buf[0] = (v >> 0) & 0xFF; + buf[1] = (v >> 8) & 0xFF; + buf[2] = (v >> 16) & 0xFF; + buf[3] = (v >> 24) & 0xFF; + } + +private: + void frame(); + bool commitReady() const; + bool checkSpace(int bytes); + + char *const mBuf; + sem_t *const mReaderSem; + uint64_t mCommitTime; + sem_t mWriterSem; + const int mSize; + int mReadPos; + int mWritePos; + int mCommitPos; + bool mAvailable; + bool mIsDone; + const int32_t mCore; + const int32_t mBufType; + + // Intentionally unimplemented + Buffer(const Buffer &); + Buffer &operator=(const Buffer &); +}; + +#endif // BUFFER_H diff --git a/tools/gator/daemon/CCNDriver.cpp b/tools/gator/daemon/CCNDriver.cpp new file mode 100644 index 00000000..dd1a2b13 --- /dev/null +++ b/tools/gator/daemon/CCNDriver.cpp @@ -0,0 +1,295 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "CCNDriver.h" + +#include +#include +#include +#include +#include + +#include "k/perf_event.h" + +#include "Config.h" +#include "DriverSource.h" +#include "Logging.h" + +static const char TAG_CATEGORY[] = "category"; +static const char TAG_COUNTER_SET[] = "counter_set"; +static const char TAG_EVENT[] = "event"; +static const char TAG_OPTION[] = "option"; +static const char TAG_OPTION_SET[] = "option_set"; + +static const char ATTR_AVERAGE_SELECTION[] = "average_selection"; +static const char ATTR_COUNTER[] = "counter"; +static const char ATTR_COUNTER_SET[] = "counter_set"; +static const char ATTR_COUNT[] = "count"; +static const char ATTR_DESCRIPTION[] = "description"; +static const char ATTR_DISPLAY[] = "display"; +static const char ATTR_EVENT[] = "event"; +static const char ATTR_EVENT_DELTA[] = "event_delta"; +static const char ATTR_NAME[] = "name"; +static const char ATTR_OPTION_SET[] = "option_set"; +static const char ATTR_TITLE[] = "title"; +static const char ATTR_UNITS[] = "units"; + +static const char XP_REGION[] = "XP_Region"; +static const char HNF_REGION[] = "HN-F_Region"; +static const char RNI_REGION[] = "RN-I_Region"; +static const char SBAS_REGION[] = "SBAS_Region"; +static const char CCN_5XX[] = "CCN-5xx"; +#define ARM_CCN_5XX "ARM_CCN_5XX_" + +static const char *const VC_TYPES[] = { "REQ", "RSP", "SNP", "DAT" }; +static const char *const XP_EVENT_NAMES[] = { NULL, "H-bit", "S-bit", "P-Cnt", "TknV" }; +static const char *const XP_EVENT_DESCRIPTIONS[] = { NULL, "Set H-bit, signaled when this XP sets the H-bit.", "Set S-bit, signaled when this XP sets the S-bit.", "Set P-Cnt, signaled when this XP sets the P-Cnt. This is not applicable for the SNP VC.", "No TknV, signaled when this XP transmits a valid packet." }; +static const char *const HNF_EVENT_NAMES[] = { NULL, "Cache Miss", "L3 SF Cache Access", "Cache Fill", "POCQ Retry", "POCQ Reqs Recvd", "SF Hit", "SF Evictions", "Snoops Sent", "Snoops Broadcast", "L3 Eviction", "L3 Fill Invalid Way", "MC Retries", "MC Reqs", "QOS HH Retry" }; +static const char *const HNF_EVENT_DESCRIPTIONS[] = { NULL, "Counts the total cache misses. This is the first time lookup result, and is high priority.", "Counts the number of cache accesses. This is the first time access, and is high priority.", "Counts the total allocations in the HN L3 cache, and all cache line allocations to the L3 cache.", "Counts the number of requests that have been retried.", "Counts the number of requests received by HN.", "Counts the number of snoop filter hits.", "Counts the number of snoop filter evictions. Cache invalidations are initiated.", "Counts the number of snoops sent. Does not differentiate between broadcast or directed snoops.", "Counts the number of snoop broadcasts sent.", "Counts the number of L3 evictions.", "Counts the number of L3 fills to an invalid way.", "Counts the number of transactions retried by the memory controller.", "Counts the number of requests to the memory controller.", "Counts the number of times a highest-priority QoS class was retried at the HN-F." }; +static const char *const RNI_EVENT_NAMES[] = { NULL, "S0 RDataBeats", "S1 RDataBeats", "S2 RDataBeats", "RXDAT Flits received", "TXDAT Flits sent", "Total TXREQ Flits sent", "Retried TXREQ Flits sent", "RRT full", "WRT full", "Replayed TXREQ Flits" }; +static const char *const RNI_EVENT_DESCRIPTIONS[] = { NULL, "S0 RDataBeats.", "S1 RDataBeats.", "S2 RDataBeats.", "RXDAT Flits received.", "TXDAT Flits sent.", "Total TXREQ Flits sent.", "Retried TXREQ Flits sent.", "RRT full.", "WRT full.", "Replayed TXREQ Flits." }; +static const char *const SBAS_EVENT_NAMES[] = { NULL, "S0 RDataBeats", NULL, NULL, "RXDAT Flits received", "TXDAT Flits sent", "Total TXREQ Flits sent", "Retried TXREQ Flits sent", "RRT full", "WRT full", "Replayed TXREQ Flits" }; +static const char *const SBAS_EVENT_DESCRIPTIONS[] = { NULL, "S0 RDataBeats.", NULL, NULL, "RXDAT Flits received.", "TXDAT Flits sent.", "Total TXREQ Flits sent.", "Retried TXREQ Flits sent.", "RRT full.", "WRT full.", "Replayed TXREQ Flits." }; + +// This class is used only to poll for CCN-5xx configuration and emit events XML for it. All other operations are handled by PerfDriver + +static int sys_perf_event_open(struct perf_event_attr *const attr, const pid_t pid, const int cpu, const int group_fd, const unsigned long flags) { + return syscall(__NR_perf_event_open, attr, pid, cpu, group_fd, flags); +} + +static unsigned int getConfig(unsigned int node, unsigned int type, unsigned int event, unsigned int port, unsigned int vc) { + return + ((node & 0xff) << 0) | + ((type & 0xff) << 8) | + ((event & 0xff) << 16) | + ((port & 0x03) << 24) | + ((vc & 0x07) << 26) | + 0; +} + +static bool perfPoll(struct perf_event_attr *const pea) { + int fd = sys_perf_event_open(pea, -1, 0, -1, 0); + if (fd < 0) { + return false; + } + close(fd); + return true; +} + +CCNDriver::CCNDriver() : mNodeTypes(NULL), mXpCount(0) { +} + +CCNDriver::~CCNDriver() { + delete mNodeTypes; +} + +bool CCNDriver::claimCounter(const Counter &) const { + // Handled by PerfDriver + return false; +} + +void CCNDriver::resetCounters() { + // Handled by PerfDriver +} + +void CCNDriver::setupCounter(Counter &) { + // Handled by PerfDriver +} + +void CCNDriver::readEvents(mxml_node_t *const) { + struct stat st; + if (stat("/sys/bus/event_source/devices/ccn", &st) != 0) { + // Not found + return; + } + + int type; + if (DriverSource::readIntDriver("/sys/bus/event_source/devices/ccn/type", &type) != 0) { + logg->logError(__FILE__, __LINE__, "Unable to read CCN-5xx type"); + handleException(); + } + + // Detect number of xps + struct perf_event_attr pea; + memset(&pea, 0, sizeof(pea)); + pea.type = type; + pea.size = sizeof(pea); + + mXpCount = 1; + while (true) { + pea.config = getConfig(0, 0x08, 1, 0, 1) | mXpCount; + if (!perfPoll(&pea)) { + break; + } + mXpCount *= 2; + }; + { + int lower = mXpCount/2 + 1; + while (lower < mXpCount) { + int mid = (lower + mXpCount)/2; + pea.config = getConfig(0, 0x08, 1, 0, 1) | mid; + if (perfPoll(&pea)) { + lower = mid + 1; + } else { + mXpCount = mid; + } + } + } + + mNodeTypes = new NodeType[2*mXpCount]; + + // Detect node types + for (int i = 0; i < 2*mXpCount; ++i) { + pea.config = getConfig(0, 0x04, 1, 0, 0) | i; + if (perfPoll(&pea)) { + mNodeTypes[i] = NT_HNF; + continue; + } + + pea.config = getConfig(0, 0x16, 1, 0, 0) | i; + if (perfPoll(&pea)) { + mNodeTypes[i] = NT_RNI; + continue; + } + + pea.config = getConfig(0, 0x10, 1, 0, 0) | i; + if (perfPoll(&pea)) { + mNodeTypes[i] = NT_SBAS; + continue; + } + + mNodeTypes[i] = NT_UNKNOWN; + } +} + +int CCNDriver::writeCounters(mxml_node_t *const) const { + // Handled by PerfDriver + return 0; +} + +void CCNDriver::writeEvents(mxml_node_t *const root) const { + mxml_node_t *const counter_set = mxmlNewElement(root, TAG_COUNTER_SET); + mxmlElementSetAttr(counter_set, ATTR_NAME, ARM_CCN_5XX "cnt"); + mxmlElementSetAttr(counter_set, ATTR_COUNT, "8"); + + mxml_node_t *const category = mxmlNewElement(root, TAG_CATEGORY); + mxmlElementSetAttr(category, ATTR_NAME, CCN_5XX); + mxmlElementSetAttr(category, TAG_COUNTER_SET, ARM_CCN_5XX "cnt"); + + mxml_node_t *const clock_event = mxmlNewElement(category, TAG_EVENT); + mxmlElementSetAttr(clock_event, ATTR_COUNTER, ARM_CCN_5XX "ccnt"); + mxmlElementSetAttr(clock_event, ATTR_EVENT, "0xff00"); + mxmlElementSetAttr(clock_event, ATTR_TITLE, "CCN-5xx Clock"); + mxmlElementSetAttr(clock_event, ATTR_NAME, "Cycles"); + mxmlElementSetAttr(clock_event, ATTR_DISPLAY, "hertz"); + mxmlElementSetAttr(clock_event, ATTR_UNITS, "Hz"); + mxmlElementSetAttr(clock_event, ATTR_AVERAGE_SELECTION, "yes"); + mxmlElementSetAttr(clock_event, ATTR_DESCRIPTION, "The number of core clock cycles"); + + mxml_node_t *const xp_option_set = mxmlNewElement(category, TAG_OPTION_SET); + mxmlElementSetAttr(xp_option_set, ATTR_NAME, XP_REGION); + + for (int i = 0; i < mXpCount; ++i) { + mxml_node_t *const option = mxmlNewElement(xp_option_set, TAG_OPTION); + mxmlElementSetAttrf(option, ATTR_EVENT_DELTA, "0x%x", getConfig(i, 0, 0, 0, 0)); + mxmlElementSetAttrf(option, ATTR_NAME, "XP %i", i); + mxmlElementSetAttrf(option, ATTR_DESCRIPTION, "Crosspoint %i", i); + } + + for (int vc = 0; vc < ARRAY_LENGTH(VC_TYPES); ++vc) { + if (VC_TYPES[vc] == NULL) { + continue; + } + for (int bus = 0; bus < 2; ++bus) { + for (int eventId = 0; eventId < ARRAY_LENGTH(XP_EVENT_NAMES); ++eventId) { + if (XP_EVENT_NAMES[eventId] == NULL) { + continue; + } + mxml_node_t *const event = mxmlNewElement(category, TAG_EVENT); + mxmlElementSetAttrf(event, ATTR_EVENT, "0x%x", getConfig(0, 0x08, eventId, bus, vc)); + mxmlElementSetAttr(event, ATTR_OPTION_SET, XP_REGION); + mxmlElementSetAttr(event, ATTR_TITLE, CCN_5XX); + mxmlElementSetAttrf(event, ATTR_NAME, "Bus %i: %s: %s", bus, VC_TYPES[vc], XP_EVENT_NAMES[eventId]); + mxmlElementSetAttrf(event, ATTR_DESCRIPTION, "Bus %i: %s: %s", bus, VC_TYPES[vc], XP_EVENT_DESCRIPTIONS[eventId]); + } + } + } + + mxml_node_t *const hnf_option_set = mxmlNewElement(category, TAG_OPTION_SET); + mxmlElementSetAttr(hnf_option_set, ATTR_NAME, HNF_REGION); + + for (int eventId = 0; eventId < ARRAY_LENGTH(HNF_EVENT_NAMES); ++eventId) { + if (HNF_EVENT_NAMES[eventId] == NULL) { + continue; + } + mxml_node_t *const event = mxmlNewElement(category, TAG_EVENT); + mxmlElementSetAttrf(event, ATTR_EVENT, "0x%x", getConfig(0, 0x04, eventId, 0, 0)); + mxmlElementSetAttr(event, ATTR_OPTION_SET, HNF_REGION); + mxmlElementSetAttr(event, ATTR_TITLE, CCN_5XX); + mxmlElementSetAttr(event, ATTR_NAME, HNF_EVENT_NAMES[eventId]); + mxmlElementSetAttr(event, ATTR_DESCRIPTION, HNF_EVENT_DESCRIPTIONS[eventId]); + } + + mxml_node_t *const rni_option_set = mxmlNewElement(category, TAG_OPTION_SET); + mxmlElementSetAttr(rni_option_set, ATTR_NAME, RNI_REGION); + + for (int eventId = 0; eventId < ARRAY_LENGTH(RNI_EVENT_NAMES); ++eventId) { + if (RNI_EVENT_NAMES[eventId] == NULL) { + continue; + } + mxml_node_t *const event = mxmlNewElement(category, TAG_EVENT); + mxmlElementSetAttrf(event, ATTR_EVENT, "0x%x", getConfig(0, 0x16, eventId, 0, 0)); + mxmlElementSetAttr(event, ATTR_OPTION_SET, RNI_REGION); + mxmlElementSetAttr(event, ATTR_TITLE, CCN_5XX); + mxmlElementSetAttr(event, ATTR_NAME, RNI_EVENT_NAMES[eventId]); + mxmlElementSetAttr(event, ATTR_DESCRIPTION, RNI_EVENT_DESCRIPTIONS[eventId]); + } + + mxml_node_t *const sbas_option_set = mxmlNewElement(category, TAG_OPTION_SET); + mxmlElementSetAttr(sbas_option_set, ATTR_NAME, SBAS_REGION); + + for (int eventId = 0; eventId < ARRAY_LENGTH(SBAS_EVENT_NAMES); ++eventId) { + if (SBAS_EVENT_NAMES[eventId] == NULL) { + continue; + } + mxml_node_t *const event = mxmlNewElement(category, TAG_EVENT); + mxmlElementSetAttrf(event, ATTR_EVENT, "0x%x", getConfig(0, 0x10, eventId, 0, 0)); + mxmlElementSetAttr(event, ATTR_OPTION_SET, SBAS_REGION); + mxmlElementSetAttr(event, ATTR_TITLE, CCN_5XX); + mxmlElementSetAttr(event, ATTR_NAME, SBAS_EVENT_NAMES[eventId]); + mxmlElementSetAttr(event, ATTR_DESCRIPTION, SBAS_EVENT_DESCRIPTIONS[eventId]); + } + + for (int i = 0; i < 2*mXpCount; ++i) { + switch (mNodeTypes[i]) { + case NT_HNF: { + mxml_node_t *const option = mxmlNewElement(hnf_option_set, TAG_OPTION); + mxmlElementSetAttrf(option, ATTR_EVENT_DELTA, "0x%x", getConfig(i, 0, 0, 0, 0)); + mxmlElementSetAttrf(option, ATTR_NAME, "HN-F %i", i); + mxmlElementSetAttrf(option, ATTR_DESCRIPTION, "Fully-coherent Home Node %i", i); + break; + } + case NT_RNI: { + mxml_node_t *const option = mxmlNewElement(rni_option_set, TAG_OPTION); + mxmlElementSetAttrf(option, ATTR_EVENT_DELTA, "0x%x", getConfig(i, 0, 0, 0, 0)); + mxmlElementSetAttrf(option, ATTR_NAME, "RN-I %i", i); + mxmlElementSetAttrf(option, ATTR_DESCRIPTION, "I/O-coherent Requesting Node %i", i); + break; + } + case NT_SBAS: { + mxml_node_t *const option = mxmlNewElement(sbas_option_set, TAG_OPTION); + mxmlElementSetAttrf(option, ATTR_EVENT_DELTA, "0x%x", getConfig(i, 0, 0, 0, 0)); + mxmlElementSetAttrf(option, ATTR_NAME, "SBAS %i", i); + mxmlElementSetAttrf(option, ATTR_DESCRIPTION, "ACE master to CHI protocol bridge %i", i); + break; + } + default: + continue; + } + } +} diff --git a/tools/gator/daemon/CCNDriver.h b/tools/gator/daemon/CCNDriver.h new file mode 100644 index 00000000..fb4c717e --- /dev/null +++ b/tools/gator/daemon/CCNDriver.h @@ -0,0 +1,43 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef CCNDRIVER_H +#define CCNDRIVER_H + +#include "Driver.h" + +class CCNDriver : public Driver { +public: + CCNDriver(); + ~CCNDriver(); + + bool claimCounter(const Counter &counter) const; + void resetCounters(); + void setupCounter(Counter &counter); + + void readEvents(mxml_node_t *const); + int writeCounters(mxml_node_t *const root) const; + void writeEvents(mxml_node_t *const) const; + +private: + enum NodeType { + NT_UNKNOWN, + NT_HNF, + NT_RNI, + NT_SBAS, + }; + + NodeType *mNodeTypes; + int mXpCount; + + // Intentionally unimplemented + CCNDriver(const CCNDriver &); + CCNDriver &operator=(const CCNDriver &); +}; + +#endif // CCNDRIVER_H diff --git a/tools/gator/daemon/CPUFreqDriver.cpp b/tools/gator/daemon/CPUFreqDriver.cpp new file mode 100644 index 00000000..41f9d6f2 --- /dev/null +++ b/tools/gator/daemon/CPUFreqDriver.cpp @@ -0,0 +1,58 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "CPUFreqDriver.h" + +#include "Buffer.h" +#include "DriverSource.h" +#include "Logging.h" +#include "SessionData.h" + +CPUFreqDriver::CPUFreqDriver() : mPrev() { +} + +CPUFreqDriver::~CPUFreqDriver() { +} + +void CPUFreqDriver::readEvents(mxml_node_t *const) { + // Only for use with perf + if (!gSessionData->perf.isSetup()) { + return; + } + + setCounters(new DriverCounter(getCounters(), strdup("Linux_power_cpu_freq"))); +} + +void CPUFreqDriver::read(Buffer *const buffer) { + char buf[64]; + const DriverCounter *const counter = getCounters(); + if ((counter == NULL) || !counter->isEnabled()) { + return; + } + + const int key = getCounters()->getKey(); + bool resetCores = false; + for (int i = 0; i < gSessionData->mCores; ++i) { + snprintf(buf, sizeof(buf), "/sys/devices/system/cpu/cpu%i/cpufreq/cpuinfo_cur_freq", i); + int64_t freq; + if (DriverSource::readInt64Driver(buf, &freq) != 0) { + freq = 0; + } + if (mPrev[i] != freq) { + mPrev[i] = freq; + // Change cores + buffer->event64(2, i); + resetCores = true; + buffer->event64(key, 1000*freq); + } + } + if (resetCores) { + // Revert cores, UserSpaceSource is all on core 0 + buffer->event64(2, 0); + } +} diff --git a/tools/gator/daemon/CPUFreqDriver.h b/tools/gator/daemon/CPUFreqDriver.h new file mode 100644 index 00000000..ad8c9aaa --- /dev/null +++ b/tools/gator/daemon/CPUFreqDriver.h @@ -0,0 +1,34 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef CPUFREQDRIVER_H +#define CPUFREQDRIVER_H + +#include "Config.h" +#include "Driver.h" + +class CPUFreqDriver : public PolledDriver { +private: + typedef PolledDriver super; + +public: + CPUFreqDriver(); + ~CPUFreqDriver(); + + void readEvents(mxml_node_t *const root); + void read(Buffer *const buffer); + +private: + int64_t mPrev[NR_CPUS]; + + // Intentionally unimplemented + CPUFreqDriver(const CPUFreqDriver &); + CPUFreqDriver &operator=(const CPUFreqDriver &); +}; + +#endif // CPUFREQDRIVER_H diff --git a/tools/gator/daemon/CapturedXML.cpp b/tools/gator/daemon/CapturedXML.cpp new file mode 100644 index 00000000..0b5802c8 --- /dev/null +++ b/tools/gator/daemon/CapturedXML.cpp @@ -0,0 +1,145 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "CapturedXML.h" + +#include +#include +#include + +#include "SessionData.h" +#include "Logging.h" +#include "OlyUtility.h" + +CapturedXML::CapturedXML() { +} + +CapturedXML::~CapturedXML() { +} + +mxml_node_t* CapturedXML::getTree(bool includeTime) { + mxml_node_t *xml; + mxml_node_t *captured; + mxml_node_t *target; + int x; + + xml = mxmlNewXML("1.0"); + + captured = mxmlNewElement(xml, "captured"); + mxmlElementSetAttr(captured, "version", "1"); + if (gSessionData->perf.isSetup()) { + mxmlElementSetAttr(captured, "type", "Perf"); + mxmlElementSetAttr(captured, "perf_beta", "yes"); + } + mxmlElementSetAttrf(captured, "protocol", "%d", PROTOCOL_VERSION); + if (includeTime) { // Send the following only after the capture is complete + if (time(NULL) > 1267000000) { // If the time is reasonable (after Feb 23, 2010) + mxmlElementSetAttrf(captured, "created", "%lu", time(NULL)); // Valid until the year 2038 + } + } + + target = mxmlNewElement(captured, "target"); + mxmlElementSetAttr(target, "name", gSessionData->mCoreName); + mxmlElementSetAttrf(target, "sample_rate", "%d", gSessionData->mSampleRate); + mxmlElementSetAttrf(target, "cores", "%d", gSessionData->mCores); + mxmlElementSetAttrf(target, "cpuid", "0x%x", gSessionData->mMaxCpuId); + + if (!gSessionData->mOneShot && (gSessionData->mSampleRate > 0)) { + mxmlElementSetAttr(target, "supports_live", "yes"); + } + + if (gSessionData->mLocalCapture) { + mxmlElementSetAttr(target, "local_capture", "yes"); + } + + mxml_node_t *counters = NULL; + for (x = 0; x < MAX_PERFORMANCE_COUNTERS; x++) { + const Counter & counter = gSessionData->mCounters[x]; + if (counter.isEnabled()) { + if (counters == NULL) { + counters = mxmlNewElement(captured, "counters"); + } + mxml_node_t *const node = mxmlNewElement(counters, "counter"); + mxmlElementSetAttrf(node, "key", "0x%x", counter.getKey()); + mxmlElementSetAttr(node, "type", counter.getType()); + if (counter.getEvent() != -1) { + mxmlElementSetAttrf(node, "event", "0x%x", counter.getEvent()); + } + if (counter.getCount() > 0) { + mxmlElementSetAttrf(node, "count", "%d", counter.getCount()); + } + if (counter.getCores() > 0) { + mxmlElementSetAttrf(node, "cores", "%d", counter.getCores()); + } + } + } + + return xml; +} + +char* CapturedXML::getXML(bool includeTime) { + char* xml_string; + mxml_node_t *xml = getTree(includeTime); + xml_string = mxmlSaveAllocString(xml, mxmlWhitespaceCB); + mxmlDelete(xml); + return xml_string; +} + +void CapturedXML::write(char* path) { + char file[PATH_MAX]; + + // Set full path + snprintf(file, PATH_MAX, "%s/captured.xml", path); + + char* xml = getXML(true); + if (util->writeToDisk(file, xml) < 0) { + logg->logError(__FILE__, __LINE__, "Error writing %s\nPlease verify the path.", file); + handleException(); + } + + free(xml); +} + +// whitespace callback utility function used with mini-xml +const char * mxmlWhitespaceCB(mxml_node_t *node, int loc) { + const char *name; + + name = mxmlGetElement(node); + + if (loc == MXML_WS_BEFORE_OPEN) { + // Single indentation + if (!strcmp(name, "target") || !strcmp(name, "counters")) + return "\n "; + + // Double indentation + if (!strcmp(name, "counter")) + return "\n "; + + // Avoid a carriage return on the first line of the xml file + if (!strncmp(name, "?xml", 4)) + return NULL; + + // Default - no indentation + return "\n"; + } + + if (loc == MXML_WS_BEFORE_CLOSE) { + // No indentation + if (!strcmp(name, "captured")) + return "\n"; + + // Single indentation + if (!strcmp(name, "counters")) + return "\n "; + + // Default - no carriage return + return NULL; + } + + return NULL; +} diff --git a/tools/gator/daemon/CapturedXML.h b/tools/gator/daemon/CapturedXML.h new file mode 100644 index 00000000..b704f6e5 --- /dev/null +++ b/tools/gator/daemon/CapturedXML.h @@ -0,0 +1,26 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __CAPTURED_XML_H__ +#define __CAPTURED_XML_H__ + +#include "mxml/mxml.h" + +class CapturedXML { +public: + CapturedXML(); + ~CapturedXML(); + char* getXML(bool includeTime); // the string should be freed by the caller + void write(char* path); +private: + mxml_node_t* getTree(bool includeTime); +}; + +const char * mxmlWhitespaceCB(mxml_node_t *node, int where); + +#endif //__CAPTURED_XML_H__ diff --git a/tools/gator/daemon/Child.cpp b/tools/gator/daemon/Child.cpp new file mode 100644 index 00000000..6b5bbb3b --- /dev/null +++ b/tools/gator/daemon/Child.cpp @@ -0,0 +1,392 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Child.h" + +#include +#include +#include +#include +#include + +#include "CapturedXML.h" +#include "Command.h" +#include "ConfigurationXML.h" +#include "Driver.h" +#include "DriverSource.h" +#include "ExternalSource.h" +#include "FtraceSource.h" +#include "LocalCapture.h" +#include "Logging.h" +#include "OlySocket.h" +#include "OlyUtility.h" +#include "PerfSource.h" +#include "Sender.h" +#include "SessionData.h" +#include "StreamlineSetup.h" +#include "UserSpaceSource.h" + +static sem_t haltPipeline, senderThreadStarted, startProfile, senderSem; // Shared by Child and spawned threads +static Source *primarySource = NULL; +static Source *externalSource = NULL; +static Source *userSpaceSource = NULL; +static Source *ftraceSource = NULL; +static Sender* sender = NULL; // Shared by Child.cpp and spawned threads +Child* child = NULL; // shared by Child.cpp and main.cpp + +extern void cleanUp(); +void handleException() { + if (child && child->numExceptions++ > 0) { + // it is possible one of the below functions itself can cause an exception, thus allow only one exception + logg->logMessage("Received multiple exceptions, terminating the child"); + exit(1); + } + fprintf(stderr, "%s", logg->getLastError()); + + if (child && child->socket) { + if (sender) { + // send the error, regardless of the command sent by Streamline + sender->writeData(logg->getLastError(), strlen(logg->getLastError()), RESPONSE_ERROR); + + // cannot close the socket before Streamline issues the command, so wait for the command before exiting + if (gSessionData->mWaitingOnCommand) { + char discard; + child->socket->receiveNBytes(&discard, 1); + } + + // Ensure all data is flushed + child->socket->shutdownConnection(); + + // this indirectly calls close socket which will ensure the data has been sent + delete sender; + } + } + + if (gSessionData->mLocalCapture) + cleanUp(); + + exit(1); +} + +// CTRL C Signal Handler for child process +static void child_handler(int signum) { + static bool beenHere = false; + if (beenHere == true) { + logg->logMessage("Gator is being forced to shut down."); + exit(1); + } + beenHere = true; + logg->logMessage("Gator is shutting down."); + if (signum == SIGALRM || !primarySource) { + exit(1); + } else { + child->endSession(); + alarm(5); // Safety net in case endSession does not complete within 5 seconds + } +} + +static void *durationThread(void *) { + prctl(PR_SET_NAME, (unsigned long)&"gatord-duration", 0, 0, 0); + sem_wait(&startProfile); + if (gSessionData->mSessionIsActive) { + // Time out after duration seconds + // Add a second for host-side filtering + sleep(gSessionData->mDuration + 1); + if (gSessionData->mSessionIsActive) { + logg->logMessage("Duration expired."); + child->endSession(); + } + } + logg->logMessage("Exit duration thread"); + return 0; +} + +static void *stopThread(void *) { + OlySocket* socket = child->socket; + + prctl(PR_SET_NAME, (unsigned long)&"gatord-stopper", 0, 0, 0); + while (gSessionData->mSessionIsActive) { + // This thread will stall until the APC_STOP or PING command is received over the socket or the socket is disconnected + unsigned char header[5]; + const int result = socket->receiveNBytes((char*)&header, sizeof(header)); + const char type = header[0]; + const int length = (header[1] << 0) | (header[2] << 8) | (header[3] << 16) | (header[4] << 24); + if (result == -1) { + child->endSession(); + } else if (result > 0) { + if ((type != COMMAND_APC_STOP) && (type != COMMAND_PING)) { + logg->logMessage("INVESTIGATE: Received unknown command type %d", type); + } else { + // verify a length of zero + if (length == 0) { + if (type == COMMAND_APC_STOP) { + logg->logMessage("Stop command received."); + child->endSession(); + } else { + // Ping is used to make sure gator is alive and requires an ACK as the response + logg->logMessage("Ping command received."); + sender->writeData(NULL, 0, RESPONSE_ACK); + } + } else { + logg->logMessage("INVESTIGATE: Received stop command but with length = %d", length); + } + } + } + } + + logg->logMessage("Exit stop thread"); + return 0; +} + +static void *senderThread(void *) { + char end_sequence[] = {RESPONSE_APC_DATA, 0, 0, 0, 0}; + + sem_post(&senderThreadStarted); + prctl(PR_SET_NAME, (unsigned long)&"gatord-sender", 0, 0, 0); + sem_wait(&haltPipeline); + + while (!primarySource->isDone() || + !externalSource->isDone() || + (userSpaceSource != NULL && !userSpaceSource->isDone()) || + (ftraceSource != NULL && !ftraceSource->isDone())) { + sem_wait(&senderSem); + + primarySource->write(sender); + externalSource->write(sender); + if (userSpaceSource != NULL) { + userSpaceSource->write(sender); + } + if (ftraceSource != NULL) { + ftraceSource->write(sender); + } + } + + // write end-of-capture sequence + if (!gSessionData->mLocalCapture) { + sender->writeData(end_sequence, sizeof(end_sequence), RESPONSE_APC_DATA); + } + + logg->logMessage("Exit sender thread"); + return 0; +} + +Child::Child() { + initialization(); + gSessionData->mLocalCapture = true; +} + +Child::Child(OlySocket* sock, int conn) { + initialization(); + socket = sock; + mNumConnections = conn; +} + +Child::~Child() { +} + +void Child::initialization() { + // Set up different handlers for signals + gSessionData->mSessionIsActive = true; + signal(SIGINT, child_handler); + signal(SIGTERM, child_handler); + signal(SIGABRT, child_handler); + signal(SIGALRM, child_handler); + socket = NULL; + numExceptions = 0; + mNumConnections = 0; + + // Initialize semaphores + sem_init(&senderThreadStarted, 0, 0); + sem_init(&startProfile, 0, 0); + sem_init(&senderSem, 0, 0); +} + +void Child::endSession() { + gSessionData->mSessionIsActive = false; + primarySource->interrupt(); + externalSource->interrupt(); + if (userSpaceSource != NULL) { + userSpaceSource->interrupt(); + } + if (ftraceSource != NULL) { + ftraceSource->interrupt(); + } + sem_post(&haltPipeline); +} + +void Child::run() { + LocalCapture* localCapture = NULL; + pthread_t durationThreadID, stopThreadID, senderThreadID; + + prctl(PR_SET_NAME, (unsigned long)&"gatord-child", 0, 0, 0); + + // Disable line wrapping when generating xml files; carriage returns and indentation to be added manually + mxmlSetWrapMargin(0); + + // Instantiate the Sender - must be done first, after which error messages can be sent + sender = new Sender(socket); + + if (mNumConnections > 1) { + logg->logError(__FILE__, __LINE__, "Session already in progress"); + handleException(); + } + + // Populate gSessionData with the configuration + { ConfigurationXML configuration; } + + // Set up the driver; must be done after gSessionData->mPerfCounterType[] is populated + if (!gSessionData->perf.isSetup()) { + primarySource = new DriverSource(&senderSem, &startProfile); + } else { + primarySource = new PerfSource(&senderSem, &startProfile); + } + + // Initialize all drivers + for (Driver *driver = Driver::getHead(); driver != NULL; driver = driver->getNext()) { + driver->resetCounters(); + } + + // Set up counters using the associated driver's setup function + for (int i = 0; i < MAX_PERFORMANCE_COUNTERS; i++) { + Counter & counter = gSessionData->mCounters[i]; + if (counter.isEnabled()) { + counter.getDriver()->setupCounter(counter); + } + } + + // Start up and parse session xml + if (socket) { + // Respond to Streamline requests + StreamlineSetup ss(socket); + } else { + char* xmlString; + xmlString = util->readFromDisk(gSessionData->mSessionXMLPath); + if (xmlString == 0) { + logg->logError(__FILE__, __LINE__, "Unable to read session xml file: %s", gSessionData->mSessionXMLPath); + handleException(); + } + gSessionData->parseSessionXML(xmlString); + localCapture = new LocalCapture(); + localCapture->createAPCDirectory(gSessionData->mTargetPath); + localCapture->copyImages(gSessionData->mImages); + localCapture->write(xmlString); + sender->createDataFile(gSessionData->mAPCDir); + free(xmlString); + } + + if (gSessionData->kmod.isMaliCapture() && (gSessionData->mSampleRate == 0)) { + logg->logError(__FILE__, __LINE__, "Mali counters are not supported with Sample Rate: None."); + handleException(); + } + + // Must be after session XML is parsed + if (!primarySource->prepare()) { + if (gSessionData->perf.isSetup()) { + logg->logError(__FILE__, __LINE__, "Unable to prepare gator driver for capture"); + } else { + logg->logError(__FILE__, __LINE__, "Unable to communicate with the perf API, please ensure that CONFIG_TRACING and CONFIG_CONTEXT_SWITCH_TRACER are enabled. Please refer to README_Streamline.txt for more information."); + } + handleException(); + } + + // Sender thread shall be halted until it is signaled for one shot mode + sem_init(&haltPipeline, 0, gSessionData->mOneShot ? 0 : 2); + + // Must be initialized before senderThread is started as senderThread checks externalSource + externalSource = new ExternalSource(&senderSem); + if (!externalSource->prepare()) { + logg->logError(__FILE__, __LINE__, "Unable to prepare external source for capture"); + handleException(); + } + externalSource->start(); + + // Create the duration, stop, and sender threads + bool thread_creation_success = true; + if (gSessionData->mDuration > 0 && pthread_create(&durationThreadID, NULL, durationThread, NULL)) { + thread_creation_success = false; + } else if (socket && pthread_create(&stopThreadID, NULL, stopThread, NULL)) { + thread_creation_success = false; + } else if (pthread_create(&senderThreadID, NULL, senderThread, NULL)) { + thread_creation_success = false; + } + + bool startUSSource = false; + for (int i = 0; i < ARRAY_LENGTH(gSessionData->usDrivers); ++i) { + if (gSessionData->usDrivers[i]->countersEnabled()) { + startUSSource = true; + } + } + if (startUSSource) { + userSpaceSource = new UserSpaceSource(&senderSem); + if (!userSpaceSource->prepare()) { + logg->logError(__FILE__, __LINE__, "Unable to prepare userspace source for capture"); + handleException(); + } + userSpaceSource->start(); + } + + if (gSessionData->ftraceDriver.countersEnabled()) { + ftraceSource = new FtraceSource(&senderSem); + if (!ftraceSource->prepare()) { + logg->logError(__FILE__, __LINE__, "Unable to prepare userspace source for capture"); + handleException(); + } + ftraceSource->start(); + } + + if (gSessionData->mAllowCommands && (gSessionData->mCaptureCommand != NULL)) { + pthread_t thread; + if (pthread_create(&thread, NULL, commandThread, NULL)) { + thread_creation_success = false; + } + } + + if (!thread_creation_success) { + logg->logError(__FILE__, __LINE__, "Failed to create gator threads"); + handleException(); + } + + // Wait until thread has started + sem_wait(&senderThreadStarted); + + // Start profiling + primarySource->run(); + + if (ftraceSource != NULL) { + ftraceSource->join(); + } + if (userSpaceSource != NULL) { + userSpaceSource->join(); + } + externalSource->join(); + + // Wait for the other threads to exit + pthread_join(senderThreadID, NULL); + + // Shutting down the connection should break the stop thread which is stalling on the socket recv() function + if (socket) { + logg->logMessage("Waiting on stop thread"); + socket->shutdownConnection(); + pthread_join(stopThreadID, NULL); + } + + // Write the captured xml file + if (gSessionData->mLocalCapture) { + CapturedXML capturedXML; + capturedXML.write(gSessionData->mAPCDir); + } + + logg->logMessage("Profiling ended."); + + delete ftraceSource; + delete userSpaceSource; + delete externalSource; + delete primarySource; + delete sender; + delete localCapture; +} diff --git a/tools/gator/daemon/Child.h b/tools/gator/daemon/Child.h new file mode 100644 index 00000000..cc78202c --- /dev/null +++ b/tools/gator/daemon/Child.h @@ -0,0 +1,33 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __CHILD_H__ +#define __CHILD_H__ + +class OlySocket; + +class Child { +public: + Child(); + Child(OlySocket* sock, int numConnections); + ~Child(); + void run(); + OlySocket *socket; + void endSession(); + int numExceptions; +private: + int mNumConnections; + + void initialization(); + + // Intentionally unimplemented + Child(const Child &); + Child &operator=(const Child &); +}; + +#endif //__CHILD_H__ diff --git a/tools/gator/daemon/Command.cpp b/tools/gator/daemon/Command.cpp new file mode 100644 index 00000000..28d73cf5 --- /dev/null +++ b/tools/gator/daemon/Command.cpp @@ -0,0 +1,172 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Command.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Logging.h" +#include "SessionData.h" + +static int getUid(const char *const name, char *const shPath, const char *const tmpDir) { + // Lookups may fail when using a different libc or a statically compiled executable + char gatorTemp[32]; + snprintf(gatorTemp, sizeof(gatorTemp), "%s/gator_temp", tmpDir); + + const int fd = open(gatorTemp, 600, O_CREAT | O_CLOEXEC); + if (fd < 0) { + return -1; + } + close(fd); + + char cmd[128]; + snprintf(cmd, sizeof(cmd), "chown %s %s || rm %s", name, gatorTemp, gatorTemp); + + const int pid = fork(); + if (pid < 0) { + logg->logError(__FILE__, __LINE__, "fork failed"); + handleException(); + } + if (pid == 0) { + char cargv1[] = "-c"; + char *cargv[] = { + shPath, + cargv1, + cmd, + NULL, + }; + + execv(cargv[0], cargv); + exit(-1); + } + while ((waitpid(pid, NULL, 0) < 0) && (errno == EINTR)); + + struct stat st; + int result = -1; + if (stat(gatorTemp, &st) == 0) { + result = st.st_uid; + } + unlink(gatorTemp); + return result; +} + +static int getUid(const char *const name) { + // Look up the username + struct passwd *const user = getpwnam(name); + if (user != NULL) { + return user->pw_uid; + } + + + // Are we on Linux + char cargv0l[] = "/bin/sh"; + if ((access(cargv0l, X_OK) == 0) && (access("/tmp", W_OK) == 0)) { + return getUid(name, cargv0l, "/tmp"); + } + + // Are we on android + char cargv0a[] = "/system/bin/sh"; + if ((access(cargv0a, X_OK) == 0) && (access("/data", W_OK) == 0)) { + return getUid(name, cargv0a, "/data"); + } + + return -1; +} + +void *commandThread(void *) { + prctl(PR_SET_NAME, (unsigned long)&"gatord-command", 0, 0, 0); + + const char *const name = gSessionData->mCaptureUser == NULL ? "nobody" : gSessionData->mCaptureUser; + const int uid = getUid(name); + if (uid < 0) { + logg->logError(__FILE__, __LINE__, "Unable to lookup the user %s, please double check that the user exists", name); + handleException(); + } + + sleep(3); + + char buf[128]; + int pipefd[2]; + if (pipe_cloexec(pipefd) != 0) { + logg->logError(__FILE__, __LINE__, "pipe failed"); + handleException(); + } + + const int pid = fork(); + if (pid < 0) { + logg->logError(__FILE__, __LINE__, "fork failed"); + handleException(); + } + if (pid == 0) { + char cargv0l[] = "/bin/sh"; + char cargv0a[] = "/system/bin/sh"; + char cargv1[] = "-c"; + char *cargv[] = { + cargv0l, + cargv1, + gSessionData->mCaptureCommand, + NULL, + }; + + buf[0] = '\0'; + close(pipefd[0]); + + // Gator runs at a high priority, reset the priority to the default + if (setpriority(PRIO_PROCESS, syscall(__NR_gettid), 0) == -1) { + snprintf(buf, sizeof(buf), "setpriority failed"); + goto fail_exit; + } + + if (setuid(uid) != 0) { + snprintf(buf, sizeof(buf), "setuid failed"); + goto fail_exit; + } + + { + const char *const path = gSessionData->mCaptureWorkingDir == NULL ? "/" : gSessionData->mCaptureWorkingDir; + if (chdir(path) != 0) { + snprintf(buf, sizeof(buf), "Unable to cd to %s, please verify the directory exists and is accessable to %s", path, name); + goto fail_exit; + } + } + + execv(cargv[0], cargv); + cargv[0] = cargv0a; + execv(cargv[0], cargv); + snprintf(buf, sizeof(buf), "execv failed"); + + fail_exit: + if (buf[0] != '\0') { + const ssize_t bytes = write(pipefd[1], buf, sizeof(buf)); + // Can't do anything if this fails + (void)bytes; + } + + exit(-1); + } + + close(pipefd[1]); + const ssize_t bytes = read(pipefd[0], buf, sizeof(buf)); + if (bytes > 0) { + logg->logError(__FILE__, __LINE__, buf); + handleException(); + } + close(pipefd[0]); + + return NULL; +} diff --git a/tools/gator/daemon/Command.h b/tools/gator/daemon/Command.h new file mode 100644 index 00000000..17244b7a --- /dev/null +++ b/tools/gator/daemon/Command.h @@ -0,0 +1,14 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef COMMAND_H +#define COMMAND_H + +void *commandThread(void *); + +#endif // COMMAND_H diff --git a/tools/gator/daemon/Config.h b/tools/gator/daemon/Config.h new file mode 100644 index 00000000..bee383a1 --- /dev/null +++ b/tools/gator/daemon/Config.h @@ -0,0 +1,28 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef CONFIG_H +#define CONFIG_H + +#define ARRAY_LENGTH(A) static_cast(sizeof(A)/sizeof((A)[0])) +#define ACCESS_ONCE(x) (*(volatile typeof(x)*)&(x)) + +#define MAX_PERFORMANCE_COUNTERS 50 +#define NR_CPUS 32 + +template +static inline T min(const T a, const T b) { + return (a < b ? a : b); +} + +template +static inline T max(const T a, const T b) { + return (a > b ? a : b); +} + +#endif // CONFIG_H diff --git a/tools/gator/daemon/ConfigurationXML.cpp b/tools/gator/daemon/ConfigurationXML.cpp new file mode 100644 index 00000000..6590dd38 --- /dev/null +++ b/tools/gator/daemon/ConfigurationXML.cpp @@ -0,0 +1,217 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "ConfigurationXML.h" + +#include +#include +#include + +#include "Driver.h" +#include "Logging.h" +#include "OlyUtility.h" +#include "SessionData.h" + +static const char* ATTR_COUNTER = "counter"; +static const char* ATTR_REVISION = "revision"; +static const char* ATTR_EVENT = "event"; +static const char* ATTR_COUNT = "count"; +static const char* ATTR_CORES = "cores"; + +ConfigurationXML::ConfigurationXML() { + const char * configuration_xml; + unsigned int configuration_xml_len; + getDefaultConfigurationXml(configuration_xml, configuration_xml_len); + + char path[PATH_MAX]; + + getPath(path); + mConfigurationXML = util->readFromDisk(path); + + for (int retryCount = 0; retryCount < 2; ++retryCount) { + if (mConfigurationXML == NULL) { + logg->logMessage("Unable to locate configuration.xml, using default in binary"); + // null-terminate configuration_xml + mConfigurationXML = (char*)malloc(configuration_xml_len + 1); + memcpy(mConfigurationXML, (const void*)configuration_xml, configuration_xml_len); + mConfigurationXML[configuration_xml_len] = 0; + } + + int ret = parse(mConfigurationXML); + if (ret == 1) { + remove(); + + // Free the current configuration and reload + free((void*)mConfigurationXML); + mConfigurationXML = NULL; + continue; + } + + break; + } + + validate(); +} + +ConfigurationXML::~ConfigurationXML() { + if (mConfigurationXML) { + free((void*)mConfigurationXML); + } +} + +int ConfigurationXML::parse(const char* configurationXML) { + mxml_node_t *tree, *node; + int ret; + + // clear counter overflow + gSessionData->mCounterOverflow = 0; + gSessionData->mIsEBS = false; + mIndex = 0; + + // disable all counters prior to parsing the configuration xml + for (int i = 0; i < MAX_PERFORMANCE_COUNTERS; i++) { + gSessionData->mCounters[i].setEnabled(false); + } + + tree = mxmlLoadString(NULL, configurationXML, MXML_NO_CALLBACK); + + node = mxmlGetFirstChild(tree); + while (node && mxmlGetType(node) != MXML_ELEMENT) + node = mxmlWalkNext(node, tree, MXML_NO_DESCEND); + + ret = configurationsTag(node); + + node = mxmlGetFirstChild(node); + while (node) { + if (mxmlGetType(node) != MXML_ELEMENT) { + node = mxmlWalkNext(node, tree, MXML_NO_DESCEND); + continue; + } + configurationTag(node); + node = mxmlWalkNext(node, tree, MXML_NO_DESCEND); + } + + mxmlDelete(tree); + + return ret; +} + +void ConfigurationXML::validate(void) { + for (int i = 0; i < MAX_PERFORMANCE_COUNTERS; i++) { + const Counter & counter = gSessionData->mCounters[i]; + if (counter.isEnabled()) { + if (strcmp(counter.getType(), "") == 0) { + logg->logError(__FILE__, __LINE__, "Invalid required attribute in configuration.xml:\n counter=\"%s\"\n event=%d\n", counter.getType(), counter.getEvent()); + handleException(); + } + + // iterate through the remaining enabled performance counters + for (int j = i + 1; j < MAX_PERFORMANCE_COUNTERS; j++) { + const Counter & counter2 = gSessionData->mCounters[j]; + if (counter2.isEnabled()) { + // check if the types are the same + if (strcmp(counter.getType(), counter2.getType()) == 0) { + logg->logError(__FILE__, __LINE__, "Duplicate performance counter type in configuration.xml: %s", counter.getType()); + handleException(); + } + } + } + } + } +} + +#define CONFIGURATION_REVISION 3 +int ConfigurationXML::configurationsTag(mxml_node_t *node) { + const char* revision_string; + + revision_string = mxmlElementGetAttr(node, ATTR_REVISION); + if (!revision_string) { + return 1; //revision issue; + } + + int revision = strtol(revision_string, NULL, 10); + if (revision < CONFIGURATION_REVISION) { + return 1; // revision issue + } + + // A revision >= CONFIGURATION_REVISION is okay + // Greater than can occur when Streamline is newer than gator + + return 0; +} + +void ConfigurationXML::configurationTag(mxml_node_t *node) { + // handle all other performance counters + if (mIndex >= MAX_PERFORMANCE_COUNTERS) { + mIndex++; + gSessionData->mCounterOverflow = mIndex; + return; + } + + // read attributes + Counter & counter = gSessionData->mCounters[mIndex]; + counter.clear(); + if (mxmlElementGetAttr(node, ATTR_COUNTER)) counter.setType(mxmlElementGetAttr(node, ATTR_COUNTER)); + if (mxmlElementGetAttr(node, ATTR_EVENT)) counter.setEvent(strtol(mxmlElementGetAttr(node, ATTR_EVENT), NULL, 16)); + if (mxmlElementGetAttr(node, ATTR_COUNT)) counter.setCount(strtol(mxmlElementGetAttr(node, ATTR_COUNT), NULL, 10)); + if (mxmlElementGetAttr(node, ATTR_CORES)) counter.setCores(strtol(mxmlElementGetAttr(node, ATTR_CORES), NULL, 10)); + if (counter.getCount() > 0) { + gSessionData->mIsEBS = true; + } + counter.setEnabled(true); + + // Associate a driver with each counter + for (Driver *driver = Driver::getHead(); driver != NULL; driver = driver->getNext()) { + if (driver->claimCounter(counter)) { + if (counter.getDriver() != NULL) { + logg->logError(__FILE__, __LINE__, "More than one driver has claimed %s:%i", counter.getType(), counter.getEvent()); + handleException(); + } + counter.setDriver(driver); + } + } + + // If no driver is associated with the counter, disable it + if (counter.getDriver() == NULL) { + logg->logMessage("No driver has claimed %s:%i", counter.getType(), counter.getEvent()); + counter.setEnabled(false); + } + + if (counter.isEnabled()) { + // update counter index + mIndex++; + } +} + +void ConfigurationXML::getDefaultConfigurationXml(const char * & xml, unsigned int & len) { +#include "defaults_xml.h" // defines and initializes char defaults_xml[] and int defaults_xml_len + xml = (const char *)defaults_xml; + len = defaults_xml_len; +} + +void ConfigurationXML::getPath(char* path) { + if (gSessionData->mConfigurationXMLPath) { + strncpy(path, gSessionData->mConfigurationXMLPath, PATH_MAX); + } else { + if (util->getApplicationFullPath(path, PATH_MAX) != 0) { + logg->logMessage("Unable to determine the full path of gatord, the cwd will be used"); + } + strncat(path, "configuration.xml", PATH_MAX - strlen(path) - 1); + } +} + +void ConfigurationXML::remove() { + char path[PATH_MAX]; + getPath(path); + + if (::remove(path) != 0) { + logg->logError(__FILE__, __LINE__, "Invalid configuration.xml file detected and unable to delete it. To resolve, delete configuration.xml on disk"); + handleException(); + } + logg->logMessage("Invalid configuration.xml file detected and removed"); +} diff --git a/tools/gator/daemon/ConfigurationXML.h b/tools/gator/daemon/ConfigurationXML.h new file mode 100644 index 00000000..efa415e5 --- /dev/null +++ b/tools/gator/daemon/ConfigurationXML.h @@ -0,0 +1,38 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef COUNTERS_H +#define COUNTERS_H + +#include "mxml/mxml.h" + +class ConfigurationXML { +public: + static void getDefaultConfigurationXml(const char * & xml, unsigned int & len); + static void getPath(char* path); + static void remove(); + + ConfigurationXML(); + ~ConfigurationXML(); + const char* getConfigurationXML() {return mConfigurationXML;} + void validate(void); + +private: + char* mConfigurationXML; + int mIndex; + + int parse(const char* xmlFile); + int configurationsTag(mxml_node_t *node); + void configurationTag(mxml_node_t *node); + + // Intentionally unimplemented + ConfigurationXML(const ConfigurationXML &); + ConfigurationXML &operator=(const ConfigurationXML &); +}; + +#endif // COUNTERS_H diff --git a/tools/gator/daemon/Counter.h b/tools/gator/daemon/Counter.h new file mode 100644 index 00000000..5202aa04 --- /dev/null +++ b/tools/gator/daemon/Counter.h @@ -0,0 +1,65 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef COUNTER_H +#define COUNTER_H + +#include + +class Driver; + +class Counter { +public: + static const size_t MAX_STRING_LEN = 80; + static const size_t MAX_DESCRIPTION_LEN = 400; + + Counter () { + clear(); + } + + void clear () { + mType[0] = '\0'; + mEnabled = false; + mEvent = -1; + mCount = 0; + mCores = -1; + mKey = 0; + mDriver = NULL; + } + + void setType(const char *const type) { strncpy(mType, type, sizeof(mType)); mType[sizeof(mType) - 1] = '\0'; } + void setEnabled(const bool enabled) { mEnabled = enabled; } + void setEvent(const int event) { mEvent = event; } + void setCount(const int count) { mCount = count; } + void setCores(const int cores) { mCores = cores; } + void setKey(const int key) { mKey = key; } + void setDriver(Driver *const driver) { mDriver = driver; } + + const char *getType() const { return mType;} + bool isEnabled() const { return mEnabled; } + int getEvent() const { return mEvent; } + int getCount() const { return mCount; } + int getCores() const { return mCores; } + int getKey() const { return mKey; } + Driver *getDriver() const { return mDriver; } + +private: + // Intentionally unimplemented + Counter(const Counter &); + Counter & operator=(const Counter &); + + char mType[MAX_STRING_LEN]; + bool mEnabled; + int mEvent; + int mCount; + int mCores; + int mKey; + Driver *mDriver; +}; + +#endif // COUNTER_H diff --git a/tools/gator/daemon/DiskIODriver.cpp b/tools/gator/daemon/DiskIODriver.cpp new file mode 100644 index 00000000..5deb0f37 --- /dev/null +++ b/tools/gator/daemon/DiskIODriver.cpp @@ -0,0 +1,125 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +// Define to get format macros from inttypes.h +#define __STDC_FORMAT_MACROS + +#include "DiskIODriver.h" + +#include + +#include "Logging.h" +#include "SessionData.h" + +class DiskIOCounter : public DriverCounter { +public: + DiskIOCounter(DriverCounter *next, char *const name, int64_t *const value); + ~DiskIOCounter(); + + int64_t read(); + +private: + int64_t *const mValue; + int64_t mPrev; + + // Intentionally unimplemented + DiskIOCounter(const DiskIOCounter &); + DiskIOCounter &operator=(const DiskIOCounter &); +}; + +DiskIOCounter::DiskIOCounter(DriverCounter *next, char *const name, int64_t *const value) : DriverCounter(next, name), mValue(value), mPrev(0) { +} + +DiskIOCounter::~DiskIOCounter() { +} + +int64_t DiskIOCounter::read() { + int64_t result = *mValue - mPrev; + mPrev = *mValue; + // Kernel assumes a sector is 512 bytes + return result << 9; +} + +DiskIODriver::DiskIODriver() : mBuf(), mReadBytes(0), mWriteBytes(0) { +} + +DiskIODriver::~DiskIODriver() { +} + +void DiskIODriver::readEvents(mxml_node_t *const) { + // Only for use with perf + if (!gSessionData->perf.isSetup()) { + return; + } + + setCounters(new DiskIOCounter(getCounters(), strdup("Linux_block_rq_rd"), &mReadBytes)); + setCounters(new DiskIOCounter(getCounters(), strdup("Linux_block_rq_wr"), &mWriteBytes)); +} + +void DiskIODriver::doRead() { + if (!countersEnabled()) { + return; + } + + if (!mBuf.read("/proc/diskstats")) { + logg->logError(__FILE__, __LINE__, "Unable to read /proc/diskstats"); + handleException(); + } + + mReadBytes = 0; + mWriteBytes = 0; + + char *lastName = NULL; + int lastNameLen = -1; + char *start = mBuf.getBuf(); + while (*start != '\0') { + char *end = strchr(start, '\n'); + if (end != NULL) { + *end = '\0'; + } + + int nameStart = -1; + int nameEnd = -1; + int64_t readBytes = -1; + int64_t writeBytes = -1; + const int count = sscanf(start, "%*d %*d %n%*s%n %*u %*u %" SCNu64 " %*u %*u %*u %" SCNu64, &nameStart, &nameEnd, &readBytes, &writeBytes); + if (count != 2) { + logg->logError(__FILE__, __LINE__, "Unable to parse /proc/diskstats"); + handleException(); + } + + // Skip partitions which are identified if the name is a substring of the last non-partition + if ((lastName == NULL) || (strncmp(lastName, start + nameStart, lastNameLen) != 0)) { + lastName = start + nameStart; + lastNameLen = nameEnd - nameStart; + mReadBytes += readBytes; + mWriteBytes += writeBytes; + } + + if (end == NULL) { + break; + } + start = end + 1; + } +} + +void DiskIODriver::start() { + doRead(); + // Initialize previous values + for (DriverCounter *counter = getCounters(); counter != NULL; counter = counter->getNext()) { + if (!counter->isEnabled()) { + continue; + } + counter->read(); + } +} + +void DiskIODriver::read(Buffer *const buffer) { + doRead(); + super::read(buffer); +} diff --git a/tools/gator/daemon/DiskIODriver.h b/tools/gator/daemon/DiskIODriver.h new file mode 100644 index 00000000..d0db18c7 --- /dev/null +++ b/tools/gator/daemon/DiskIODriver.h @@ -0,0 +1,39 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef DISKIODRIVER_H +#define DISKIODRIVER_H + +#include "Driver.h" +#include "DynBuf.h" + +class DiskIODriver : public PolledDriver { +private: + typedef PolledDriver super; + +public: + DiskIODriver(); + ~DiskIODriver(); + + void readEvents(mxml_node_t *const root); + void start(); + void read(Buffer *const buffer); + +private: + void doRead(); + + DynBuf mBuf; + int64_t mReadBytes; + int64_t mWriteBytes; + + // Intentionally unimplemented + DiskIODriver(const DiskIODriver &); + DiskIODriver &operator=(const DiskIODriver &); +}; + +#endif // DISKIODRIVER_H diff --git a/tools/gator/daemon/Driver.cpp b/tools/gator/daemon/Driver.cpp new file mode 100644 index 00000000..275da31c --- /dev/null +++ b/tools/gator/daemon/Driver.cpp @@ -0,0 +1,96 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Driver.h" + +#include "Buffer.h" +#include "SessionData.h" + +DriverCounter::DriverCounter(DriverCounter *const next, const char *const name) : mNext(next), mName(name), mKey(getEventKey()), mEnabled(false) { +} + +DriverCounter::~DriverCounter() { + delete mName; +} + +Driver *Driver::head = NULL; + +Driver::Driver() : next(head) { + head = this; +} + +SimpleDriver::~SimpleDriver() { + DriverCounter *counters = mCounters; + while (counters != NULL) { + DriverCounter *counter = counters; + counters = counter->getNext(); + delete counter; + } +} + +DriverCounter *SimpleDriver::findCounter(const Counter &counter) const { + for (DriverCounter *driverCounter = mCounters; driverCounter != NULL; driverCounter = driverCounter->getNext()) { + if (strcmp(driverCounter->getName(), counter.getType()) == 0) { + return driverCounter; + } + } + + return NULL; +} + +bool SimpleDriver::claimCounter(const Counter &counter) const { + return findCounter(counter) != NULL; +} + +bool SimpleDriver::countersEnabled() const { + for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) { + if (counter->isEnabled()) { + return true; + } + } + return false; +} + +void SimpleDriver::resetCounters() { + for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) { + counter->setEnabled(false); + } +} + +void SimpleDriver::setupCounter(Counter &counter) { + DriverCounter *const driverCounter = findCounter(counter); + if (driverCounter == NULL) { + counter.setEnabled(false); + return; + } + driverCounter->setEnabled(true); + counter.setKey(driverCounter->getKey()); +} + +int SimpleDriver::writeCounters(mxml_node_t *root) const { + int count = 0; + for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) { + mxml_node_t *node = mxmlNewElement(root, "counter"); + mxmlElementSetAttr(node, "name", counter->getName()); + ++count; + } + + return count; +} + +PolledDriver::~PolledDriver() { +} + +void PolledDriver::read(Buffer *const buffer) { + for (DriverCounter *counter = getCounters(); counter != NULL; counter = counter->getNext()) { + if (!counter->isEnabled()) { + continue; + } + buffer->event64(counter->getKey(), counter->read()); + } +} diff --git a/tools/gator/daemon/Driver.h b/tools/gator/daemon/Driver.h new file mode 100644 index 00000000..72870e3d --- /dev/null +++ b/tools/gator/daemon/Driver.h @@ -0,0 +1,118 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef DRIVER_H +#define DRIVER_H + +#include + +#include "mxml/mxml.h" + +class Buffer; +class Counter; + +class DriverCounter { +public: + DriverCounter(DriverCounter *const next, const char *const name); + virtual ~DriverCounter(); + + DriverCounter *getNext() const { return mNext; } + const char *getName() const { return mName; } + int getKey() const { return mKey; } + bool isEnabled() const { return mEnabled; } + void setEnabled(const bool enabled) { mEnabled = enabled; } + virtual int64_t read() { return -1; } + +private: + DriverCounter *const mNext; + const char *const mName; + const int mKey; + bool mEnabled; + + // Intentionally unimplemented + DriverCounter(const DriverCounter &); + DriverCounter &operator=(const DriverCounter &); +}; + +class Driver { +public: + static Driver *getHead() { return head; } + + virtual ~Driver() {} + + // Returns true if this driver can manage the counter + virtual bool claimCounter(const Counter &counter) const = 0; + // Clears and disables all counters + virtual void resetCounters() = 0; + // Enables and prepares the counter for capture + virtual void setupCounter(Counter &counter) = 0; + + // Performs any actions needed for setup or based on eventsXML + virtual void readEvents(mxml_node_t *const) {} + // Emits available counters + virtual int writeCounters(mxml_node_t *const root) const = 0; + // Emits possible dynamically generated events/counters + virtual void writeEvents(mxml_node_t *const) const {} + + Driver *getNext() const { return next; } + +protected: + Driver(); + +private: + static Driver *head; + Driver *next; + + // Intentionally unimplemented + Driver(const Driver &); + Driver &operator=(const Driver &); +}; + +class SimpleDriver : public Driver { +public: + virtual ~SimpleDriver(); + + bool claimCounter(const Counter &counter) const; + bool countersEnabled() const; + void resetCounters(); + void setupCounter(Counter &counter); + int writeCounters(mxml_node_t *root) const; + +protected: + SimpleDriver() : mCounters(NULL) {} + + DriverCounter *getCounters() const { return mCounters; } + void setCounters(DriverCounter *const counter) { mCounters = counter; } + + DriverCounter *findCounter(const Counter &counter) const; + +private: + DriverCounter *mCounters; + + // Intentionally unimplemented + SimpleDriver(const SimpleDriver &); + SimpleDriver &operator=(const SimpleDriver &); +}; + +class PolledDriver : public SimpleDriver { +public: + virtual ~PolledDriver(); + + virtual void start() {} + virtual void read(Buffer *const buffer); + +protected: + PolledDriver() {} + +private: + // Intentionally unimplemented + PolledDriver(const PolledDriver &); + PolledDriver &operator=(const PolledDriver &); +}; + +#endif // DRIVER_H diff --git a/tools/gator/daemon/DriverSource.cpp b/tools/gator/daemon/DriverSource.cpp new file mode 100644 index 00000000..7f299b64 --- /dev/null +++ b/tools/gator/daemon/DriverSource.cpp @@ -0,0 +1,322 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +// Define to get format macros from inttypes.h +#define __STDC_FORMAT_MACROS + +#include "DriverSource.h" + +#include +#include +#include +#include + +#include "Buffer.h" +#include "Child.h" +#include "DynBuf.h" +#include "Fifo.h" +#include "Logging.h" +#include "Proc.h" +#include "Sender.h" +#include "SessionData.h" + +extern Child *child; + +DriverSource::DriverSource(sem_t *senderSem, sem_t *startProfile) : mBuffer(NULL), mFifo(NULL), mSenderSem(senderSem), mStartProfile(startProfile), mBufferSize(0), mBufferFD(0), mLength(1) { + int driver_version = 0; + + mBuffer = new Buffer(0, FRAME_PERF_ATTRS, 4*1024*1024, senderSem); + if (readIntDriver("/dev/gator/version", &driver_version) == -1) { + logg->logError(__FILE__, __LINE__, "Error reading gator driver version"); + handleException(); + } + + // Verify the driver version matches the daemon version + if (driver_version != PROTOCOL_VERSION) { + if ((driver_version > PROTOCOL_DEV) || (PROTOCOL_VERSION > PROTOCOL_DEV)) { + // One of the mismatched versions is development version + logg->logError(__FILE__, __LINE__, + "DEVELOPMENT BUILD MISMATCH: gator driver version \"%d\" is not in sync with gator daemon version \"%d\".\n" + ">> The following must be synchronized from engineering repository:\n" + ">> * gator driver\n" + ">> * gator daemon\n" + ">> * Streamline", driver_version, PROTOCOL_VERSION); + handleException(); + } else { + // Release version mismatch + logg->logError(__FILE__, __LINE__, + "gator driver version \"%d\" is different than gator daemon version \"%d\".\n" + ">> Please upgrade the driver and daemon to the latest versions.", driver_version, PROTOCOL_VERSION); + handleException(); + } + } + + int enable = -1; + if (readIntDriver("/dev/gator/enable", &enable) != 0 || enable != 0) { + logg->logError(__FILE__, __LINE__, "Driver already enabled, possibly a session is already in progress."); + handleException(); + } + + readIntDriver("/dev/gator/cpu_cores", &gSessionData->mCores); + if (gSessionData->mCores == 0) { + gSessionData->mCores = 1; + } + + if (readIntDriver("/dev/gator/buffer_size", &mBufferSize) || mBufferSize <= 0) { + logg->logError(__FILE__, __LINE__, "Unable to read the driver buffer size"); + handleException(); + } +} + +DriverSource::~DriverSource() { + delete mFifo; + + // Write zero for safety, as a zero should have already been written + writeDriver("/dev/gator/enable", "0"); + + // Calls event_buffer_release in the driver + if (mBufferFD) { + close(mBufferFD); + } +} + +bool DriverSource::prepare() { + // Create user-space buffers, add 5 to the size to account for the 1-byte type and 4-byte length + logg->logMessage("Created %d MB collector buffer with a %d-byte ragged end", gSessionData->mTotalBufferSize, mBufferSize); + mFifo = new Fifo(mBufferSize + 5, gSessionData->mTotalBufferSize*1024*1024, mSenderSem); + + return true; +} + +void DriverSource::bootstrapThread() { + prctl(PR_SET_NAME, (unsigned long)&"gatord-proc", 0, 0, 0); + + DynBuf printb; + DynBuf b1; + DynBuf b2; + const uint64_t currTime = getTime(); + + if (!readProcComms(currTime, mBuffer, &printb, &b1, &b2)) { + logg->logError(__FILE__, __LINE__, "readProcComms failed"); + handleException(); + } + + mBuffer->commit(currTime); + mBuffer->setDone(); +} + +void *DriverSource::bootstrapThreadStatic(void *arg) { + static_cast(arg)->bootstrapThread(); + return NULL; +} + +void DriverSource::run() { + // Get the initial pointer to the collect buffer + char *collectBuffer = mFifo->start(); + int bytesCollected = 0; + + logg->logMessage("********** Profiling started **********"); + + // Set the maximum backtrace depth + if (writeReadDriver("/dev/gator/backtrace_depth", &gSessionData->mBacktraceDepth)) { + logg->logError(__FILE__, __LINE__, "Unable to set the driver backtrace depth"); + handleException(); + } + + // open the buffer which calls userspace_buffer_open() in the driver + mBufferFD = open("/dev/gator/buffer", O_RDONLY | O_CLOEXEC); + if (mBufferFD < 0) { + logg->logError(__FILE__, __LINE__, "The gator driver did not set up properly. Please view the linux console or dmesg log for more information on the failure."); + handleException(); + } + + // set the tick rate of the profiling timer + if (writeReadDriver("/dev/gator/tick", &gSessionData->mSampleRate) != 0) { + logg->logError(__FILE__, __LINE__, "Unable to set the driver tick"); + handleException(); + } + + // notify the kernel of the response type + int response_type = gSessionData->mLocalCapture ? 0 : RESPONSE_APC_DATA; + if (writeDriver("/dev/gator/response_type", response_type)) { + logg->logError(__FILE__, __LINE__, "Unable to write the response type"); + handleException(); + } + + // Set the live rate + if (writeReadDriver("/dev/gator/live_rate", &gSessionData->mLiveRate)) { + logg->logError(__FILE__, __LINE__, "Unable to set the driver live rate"); + handleException(); + } + + logg->logMessage("Start the driver"); + + // This command makes the driver start profiling by calling gator_op_start() in the driver + if (writeDriver("/dev/gator/enable", "1") != 0) { + logg->logError(__FILE__, __LINE__, "The gator driver did not start properly. Please view the linux console or dmesg log for more information on the failure."); + handleException(); + } + + lseek(mBufferFD, 0, SEEK_SET); + + sem_post(mStartProfile); + + pthread_t bootstrapThreadID; + if (pthread_create(&bootstrapThreadID, NULL, bootstrapThreadStatic, this) != 0) { + logg->logError(__FILE__, __LINE__, "Unable to start the gator_bootstrap thread"); + handleException(); + } + + // Collect Data + do { + // This command will stall until data is received from the driver + // Calls event_buffer_read in the driver + errno = 0; + bytesCollected = read(mBufferFD, collectBuffer, mBufferSize); + + // If read() returned due to an interrupt signal, re-read to obtain the last bit of collected data + if (bytesCollected == -1 && errno == EINTR) { + bytesCollected = read(mBufferFD, collectBuffer, mBufferSize); + } + + // return the total bytes written + logg->logMessage("Driver read of %d bytes", bytesCollected); + + // In one shot mode, stop collection once all the buffers are filled + if (gSessionData->mOneShot && gSessionData->mSessionIsActive) { + if (bytesCollected == -1 || mFifo->willFill(bytesCollected)) { + logg->logMessage("One shot"); + child->endSession(); + } + } + collectBuffer = mFifo->write(bytesCollected); + } while (bytesCollected > 0); + + logg->logMessage("Exit collect data loop"); + + pthread_join(bootstrapThreadID, NULL); +} + +void DriverSource::interrupt() { + // This command should cause the read() function in collect() to return and stop the driver from profiling + if (writeDriver("/dev/gator/enable", "0") != 0) { + logg->logMessage("Stopping kernel failed"); + } +} + +bool DriverSource::isDone() { + return mLength <= 0 && (mBuffer == NULL || mBuffer->isDone()); +} + +void DriverSource::write(Sender *sender) { + char *data = mFifo->read(&mLength); + if (data != NULL) { + sender->writeData(data, mLength, RESPONSE_APC_DATA); + mFifo->release(); + // Assume the summary packet is in the first block received from the driver + gSessionData->mSentSummary = true; + } + if (mBuffer != NULL && !mBuffer->isDone()) { + mBuffer->write(sender); + if (mBuffer->isDone()) { + Buffer *buf = mBuffer; + mBuffer = NULL; + delete buf; + } + } +} + +int DriverSource::readIntDriver(const char *fullpath, int *value) { + char data[40]; // Sufficiently large to hold any integer + const int fd = open(fullpath, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + return -1; + } + + const ssize_t bytes = read(fd, data, sizeof(data) - 1); + close(fd); + if (bytes < 0) { + return -1; + } + data[bytes] = '\0'; + + char *endptr; + errno = 0; + *value = strtol(data, &endptr, 10); + if (errno != 0 || *endptr != '\n') { + logg->logMessage("Invalid value in file %s", fullpath); + return -1; + } + + return 0; +} + +int DriverSource::readInt64Driver(const char *fullpath, int64_t *value) { + char data[40]; // Sufficiently large to hold any integer + const int fd = open(fullpath, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + return -1; + } + + const ssize_t bytes = read(fd, data, sizeof(data) - 1); + close(fd); + if (bytes < 0) { + return -1; + } + data[bytes] = '\0'; + + char *endptr; + errno = 0; + *value = strtoll(data, &endptr, 10); + if (errno != 0 || (*endptr != '\n' && *endptr != '\0')) { + logg->logMessage("Invalid value in file %s", fullpath); + return -1; + } + + return 0; +} + +int DriverSource::writeDriver(const char *fullpath, const char *data) { + int fd = open(fullpath, O_WRONLY | O_CLOEXEC); + if (fd < 0) { + return -1; + } + if (::write(fd, data, strlen(data)) < 0) { + close(fd); + logg->logMessage("Opened but could not write to %s", fullpath); + return -1; + } + close(fd); + return 0; +} + +int DriverSource::writeDriver(const char *path, int value) { + char data[40]; // Sufficiently large to hold any integer + snprintf(data, sizeof(data), "%d", value); + return writeDriver(path, data); +} + +int DriverSource::writeDriver(const char *path, int64_t value) { + char data[40]; // Sufficiently large to hold any integer + snprintf(data, sizeof(data), "%" PRIi64, value); + return writeDriver(path, data); +} + +int DriverSource::writeReadDriver(const char *path, int *value) { + if (writeDriver(path, *value) || readIntDriver(path, value)) { + return -1; + } + return 0; +} + +int DriverSource::writeReadDriver(const char *path, int64_t *value) { + if (writeDriver(path, *value) || readInt64Driver(path, value)) { + return -1; + } + return 0; +} diff --git a/tools/gator/daemon/DriverSource.h b/tools/gator/daemon/DriverSource.h new file mode 100644 index 00000000..ec27b081 --- /dev/null +++ b/tools/gator/daemon/DriverSource.h @@ -0,0 +1,57 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef DRIVERSOURCE_H +#define DRIVERSOURCE_H + +#include +#include + +#include "Source.h" + +class Buffer; +class Fifo; + +class DriverSource : public Source { +public: + DriverSource(sem_t *senderSem, sem_t *startProfile); + ~DriverSource(); + + bool prepare(); + void run(); + void interrupt(); + + bool isDone(); + void write(Sender *sender); + + static int readIntDriver(const char *fullpath, int *value); + static int readInt64Driver(const char *fullpath, int64_t *value); + static int writeDriver(const char *fullpath, const char *data); + static int writeDriver(const char *path, int value); + static int writeDriver(const char *path, int64_t value); + static int writeReadDriver(const char *path, int *value); + static int writeReadDriver(const char *path, int64_t *value); + +private: + static void *bootstrapThreadStatic(void *arg); + void bootstrapThread(); + + Buffer *mBuffer; + Fifo *mFifo; + sem_t *const mSenderSem; + sem_t *const mStartProfile; + int mBufferSize; + int mBufferFD; + int mLength; + + // Intentionally unimplemented + DriverSource(const DriverSource &); + DriverSource &operator=(const DriverSource &); +}; + +#endif // DRIVERSOURCE_H diff --git a/tools/gator/daemon/DynBuf.cpp b/tools/gator/daemon/DynBuf.cpp new file mode 100644 index 00000000..df20713a --- /dev/null +++ b/tools/gator/daemon/DynBuf.cpp @@ -0,0 +1,139 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "DynBuf.h" + +#include +#include +#include +#include +#include + +#include "Logging.h" + +// Pick an aggressive size as buffer is primarily used for disk IO +#define MIN_BUFFER_FREE (1 << 12) + +int DynBuf::resize(const size_t minCapacity) { + size_t scaledCapacity = 2 * capacity; + if (scaledCapacity < minCapacity) { + scaledCapacity = minCapacity; + } + if (scaledCapacity < 2 * MIN_BUFFER_FREE) { + scaledCapacity = 2 * MIN_BUFFER_FREE; + } + capacity = scaledCapacity; + + buf = static_cast(realloc(buf, capacity)); + if (buf == NULL) { + return -errno; + } + + return 0; +} + +bool DynBuf::read(const char *const path) { + int result = false; + + const int fd = open(path, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + logg->logMessage("%s(%s:%i): open failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + length = 0; + + for (;;) { + const size_t minCapacity = length + MIN_BUFFER_FREE + 1; + if (capacity < minCapacity) { + if (resize(minCapacity) != 0) { + logg->logMessage("%s(%s:%i): DynBuf::resize failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } + } + + const ssize_t bytes = ::read(fd, buf + length, capacity - length - 1); + if (bytes < 0) { + logg->logMessage("%s(%s:%i): read failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } else if (bytes == 0) { + break; + } + length += bytes; + } + + buf[length] = '\0'; + result = true; + + fail: + close(fd); + + return result; +} + +int DynBuf::readlink(const char *const path) { + ssize_t bytes = MIN_BUFFER_FREE; + + for (;;) { + if (static_cast(bytes) >= capacity) { + const int err = resize(2 * bytes); + if (err != 0) { + return err; + } + } + bytes = ::readlink(path, buf, capacity); + if (bytes < 0) { + return -errno; + } else if (static_cast(bytes) < capacity) { + break; + } + } + + length = bytes; + buf[bytes] = '\0'; + + return 0; +} + +bool DynBuf::printf(const char *format, ...) { + va_list ap; + + if (capacity <= 0) { + if (resize(2 * MIN_BUFFER_FREE) != 0) { + logg->logMessage("%s(%s:%i): DynBuf::resize failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + } + + va_start(ap, format); + int bytes = vsnprintf(buf, capacity, format, ap); + va_end(ap); + if (bytes < 0) { + logg->logMessage("%s(%s:%i): fsnprintf failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + if (static_cast(bytes) > capacity) { + if (resize(bytes + 1) != 0) { + logg->logMessage("%s(%s:%i): DynBuf::resize failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + va_start(ap, format); + bytes = vsnprintf(buf, capacity, format, ap); + va_end(ap); + if (bytes < 0) { + logg->logMessage("%s(%s:%i): fsnprintf failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + } + + length = bytes; + + return true; +} diff --git a/tools/gator/daemon/DynBuf.h b/tools/gator/daemon/DynBuf.h new file mode 100644 index 00000000..2f4554ab --- /dev/null +++ b/tools/gator/daemon/DynBuf.h @@ -0,0 +1,52 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef DYNBUF_H +#define DYNBUF_H + +#include + +class DynBuf { +public: + DynBuf() : capacity(0), length(0), buf(NULL) {} + ~DynBuf() { + reset(); + } + + inline void reset() { + capacity = 0; + length = 0; + if (buf != NULL) { + free(buf); + buf = NULL; + } + } + + bool read(const char *const path); + // On error instead of printing the error and returning false, this returns -errno + int readlink(const char *const path); + __attribute__ ((format(printf, 2, 3))) + bool printf(const char *format, ...); + + size_t getLength() const { return length; } + const char *getBuf() const { return buf; } + char *getBuf() { return buf; } + +private: + int resize(const size_t minCapacity); + + size_t capacity; + size_t length; + char *buf; + + // Intentionally undefined + DynBuf(const DynBuf &); + DynBuf &operator=(const DynBuf &); +}; + +#endif // DYNBUF_H diff --git a/tools/gator/daemon/EventsXML.cpp b/tools/gator/daemon/EventsXML.cpp new file mode 100644 index 00000000..d905bbab --- /dev/null +++ b/tools/gator/daemon/EventsXML.cpp @@ -0,0 +1,76 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "EventsXML.h" + +#include "CapturedXML.h" +#include "Logging.h" +#include "OlyUtility.h" +#include "SessionData.h" + +mxml_node_t *EventsXML::getTree() { +#include "events_xml.h" // defines and initializes char events_xml[] and int events_xml_len + char path[PATH_MAX]; + mxml_node_t *xml; + FILE *fl; + + // Avoid unused variable warning + (void)events_xml_len; + + // Load the provided or default events xml + if (gSessionData->mEventsXMLPath) { + strncpy(path, gSessionData->mEventsXMLPath, PATH_MAX); + } else { + util->getApplicationFullPath(path, PATH_MAX); + strncat(path, "events.xml", PATH_MAX - strlen(path) - 1); + } + fl = fopen(path, "r"); + if (fl) { + xml = mxmlLoadFile(NULL, fl, MXML_NO_CALLBACK); + fclose(fl); + } else { + logg->logMessage("Unable to locate events.xml, using default"); + xml = mxmlLoadString(NULL, (const char *)events_xml, MXML_NO_CALLBACK); + } + + return xml; +} + +char *EventsXML::getXML() { + mxml_node_t *xml = getTree(); + + // Add dynamic events from the drivers + mxml_node_t *events = mxmlFindElement(xml, xml, "events", NULL, NULL, MXML_DESCEND); + if (!events) { + logg->logError(__FILE__, __LINE__, "Unable to find node in the events.xml"); + handleException(); + } + for (Driver *driver = Driver::getHead(); driver != NULL; driver = driver->getNext()) { + driver->writeEvents(events); + } + + char *string = mxmlSaveAllocString(xml, mxmlWhitespaceCB); + mxmlDelete(xml); + + return string; +} + +void EventsXML::write(const char *path) { + char file[PATH_MAX]; + + // Set full path + snprintf(file, PATH_MAX, "%s/events.xml", path); + + char *buf = getXML(); + if (util->writeToDisk(file, buf) < 0) { + logg->logError(__FILE__, __LINE__, "Error writing %s\nPlease verify the path.", file); + handleException(); + } + + free(buf); +} diff --git a/tools/gator/daemon/EventsXML.h b/tools/gator/daemon/EventsXML.h new file mode 100644 index 00000000..ff7a02fd --- /dev/null +++ b/tools/gator/daemon/EventsXML.h @@ -0,0 +1,21 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef EVENTS_XML +#define EVENTS_XML + +#include "mxml/mxml.h" + +class EventsXML { +public: + mxml_node_t *getTree(); + char *getXML(); + void write(const char* path); +}; + +#endif // EVENTS_XML diff --git a/tools/gator/daemon/ExternalSource.cpp b/tools/gator/daemon/ExternalSource.cpp new file mode 100644 index 00000000..8f5e6b68 --- /dev/null +++ b/tools/gator/daemon/ExternalSource.cpp @@ -0,0 +1,260 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "ExternalSource.h" + +#include +#include +#include + +#include "Logging.h" +#include "OlySocket.h" +#include "SessionData.h" + +static const char MALI_VIDEO[] = "\0mali-video"; +static const char MALI_VIDEO_STARTUP[] = "\0mali-video-startup"; +static const char MALI_VIDEO_V1[] = "MALI_VIDEO 1\n"; +static const char MALI_GRAPHICS[] = "\0mali_thirdparty_server"; +static const char MALI_GRAPHICS_STARTUP[] = "\0mali_thirdparty_client"; +static const char MALI_GRAPHICS_V1[] = "MALI_GRAPHICS 1\n"; + +static bool setNonblock(const int fd) { + int flags; + + flags = fcntl(fd, F_GETFL); + if (flags < 0) { + logg->logMessage("fcntl getfl failed"); + return false; + } + + if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) { + logg->logMessage("fcntl setfl failed"); + return false; + } + + return true; +} + +ExternalSource::ExternalSource(sem_t *senderSem) : mBuffer(0, FRAME_EXTERNAL, 128*1024, senderSem), mMonitor(), mMveStartupUds(MALI_VIDEO_STARTUP, sizeof(MALI_VIDEO_STARTUP)), mMaliStartupUds(MALI_GRAPHICS_STARTUP, sizeof(MALI_GRAPHICS_STARTUP)), mAnnotate(8083), mInterruptFd(-1), mMaliUds(-1), mMveUds(-1) { + sem_init(&mBufferSem, 0, 0); +} + +ExternalSource::~ExternalSource() { +} + +void ExternalSource::waitFor(const int bytes) { + while (mBuffer.bytesAvailable() <= bytes) { + sem_wait(&mBufferSem); + } +} + +void ExternalSource::configureConnection(const int fd, const char *const handshake, size_t size) { + if (!setNonblock(fd)) { + logg->logError(__FILE__, __LINE__, "Unable to set nonblock on fh"); + handleException(); + } + + if (!mMonitor.add(fd)) { + logg->logError(__FILE__, __LINE__, "Unable to add fh to monitor"); + handleException(); + } + + // Write the handshake to the circular buffer + waitFor(Buffer::MAXSIZE_PACK32 + size - 1); + mBuffer.packInt(fd); + mBuffer.writeBytes(handshake, size - 1); + mBuffer.commit(1); +} + +bool ExternalSource::connectMali() { + mMaliUds = OlySocket::connect(MALI_GRAPHICS, sizeof(MALI_GRAPHICS)); + if (mMaliUds < 0) { + return false; + } + + configureConnection(mMaliUds, MALI_GRAPHICS_V1, sizeof(MALI_GRAPHICS_V1)); + + return true; +} + +bool ExternalSource::connectMve() { + if (!gSessionData->maliVideo.countersEnabled()) { + return true; + } + + mMveUds = OlySocket::connect(MALI_VIDEO, sizeof(MALI_VIDEO)); + if (mMveUds < 0) { + return false; + } + + if (!gSessionData->maliVideo.start(mMveUds)) { + return false; + } + + configureConnection(mMveUds, MALI_VIDEO_V1, sizeof(MALI_VIDEO_V1)); + + return true; +} + +bool ExternalSource::prepare() { + if (!mMonitor.init() || + !setNonblock(mMveStartupUds.getFd()) || !mMonitor.add(mMveStartupUds.getFd()) || + !setNonblock(mMaliStartupUds.getFd()) || !mMonitor.add(mMaliStartupUds.getFd()) || + !setNonblock(mAnnotate.getFd()) || !mMonitor.add(mAnnotate.getFd()) || + false) { + return false; + } + + connectMali(); + connectMve(); + + return true; +} + +void ExternalSource::run() { + int pipefd[2]; + + prctl(PR_SET_NAME, (unsigned long)&"gatord-external", 0, 0, 0); + + if (pipe_cloexec(pipefd) != 0) { + logg->logError(__FILE__, __LINE__, "pipe failed"); + handleException(); + } + mInterruptFd = pipefd[1]; + + if (!mMonitor.add(pipefd[0])) { + logg->logError(__FILE__, __LINE__, "Monitor::add failed"); + handleException(); + } + + // Notify annotate clients to retry connecting to gatord + gSessionData->annotateListener.signal(); + + while (gSessionData->mSessionIsActive) { + struct epoll_event events[16]; + // Clear any pending sem posts + while (sem_trywait(&mBufferSem) == 0); + int ready = mMonitor.wait(events, ARRAY_LENGTH(events), -1); + if (ready < 0) { + logg->logError(__FILE__, __LINE__, "Monitor::wait failed"); + handleException(); + } + + const uint64_t currTime = getTime(); + + for (int i = 0; i < ready; ++i) { + const int fd = events[i].data.fd; + if (fd == mMveStartupUds.getFd()) { + // Mali Video Engine says it's alive + int client = mMveStartupUds.acceptConnection(); + // Don't read from this connection, establish a new connection to Mali-V500 + close(client); + if (!connectMve()) { + logg->logError(__FILE__, __LINE__, "Unable to configure incoming Mali video connection"); + handleException(); + } + } else if (fd == mMaliStartupUds.getFd()) { + // Mali Graphics says it's alive + int client = mMaliStartupUds.acceptConnection(); + // Don't read from this connection, establish a new connection to Mali Graphics + close(client); + if (!connectMali()) { + logg->logError(__FILE__, __LINE__, "Unable to configure incoming Mali graphics connection"); + handleException(); + } + } else if (fd == mAnnotate.getFd()) { + int client = mAnnotate.acceptConnection(); + if (!setNonblock(client) || !mMonitor.add(client)) { + logg->logError(__FILE__, __LINE__, "Unable to set socket options on incoming annotation connection"); + handleException(); + } + } else if (fd == pipefd[0]) { + // Means interrupt has been called and mSessionIsActive should be reread + } else { + /* This can result in some starvation if there are multiple + * threads which are annotating heavily, but it is not + * recommended that threads annotate that much as it can also + * starve out the gator data. + */ + while (gSessionData->mSessionIsActive) { + // Wait until there is enough room for the fd, two headers and two ints + waitFor(7*Buffer::MAXSIZE_PACK32 + 2*sizeof(uint32_t)); + mBuffer.packInt(fd); + const int contiguous = mBuffer.contiguousSpaceAvailable(); + const int bytes = read(fd, mBuffer.getWritePos(), contiguous); + if (bytes < 0) { + if (errno == EAGAIN) { + // Nothing left to read + mBuffer.commit(currTime); + break; + } + // Something else failed, close the socket + mBuffer.commit(currTime); + mBuffer.packInt(-1); + mBuffer.packInt(fd); + mBuffer.commit(currTime); + close(fd); + break; + } else if (bytes == 0) { + // The other side is closed + mBuffer.commit(currTime); + mBuffer.packInt(-1); + mBuffer.packInt(fd); + mBuffer.commit(currTime); + close(fd); + break; + } + + mBuffer.advanceWrite(bytes); + mBuffer.commit(currTime); + + // Short reads also mean nothing is left to read + if (bytes < contiguous) { + break; + } + } + } + } + } + + mBuffer.setDone(); + + if (mMveUds >= 0) { + gSessionData->maliVideo.stop(mMveUds); + } + + mInterruptFd = -1; + close(pipefd[0]); + close(pipefd[1]); +} + +void ExternalSource::interrupt() { + if (mInterruptFd >= 0) { + int8_t c = 0; + // Write to the pipe to wake the monitor which will cause mSessionIsActive to be reread + if (::write(mInterruptFd, &c, sizeof(c)) != sizeof(c)) { + logg->logError(__FILE__, __LINE__, "write failed"); + handleException(); + } + } +} + +bool ExternalSource::isDone() { + return mBuffer.isDone(); +} + +void ExternalSource::write(Sender *sender) { + // Don't send external data until the summary packet is sent so that monotonic delta is available + if (!gSessionData->mSentSummary) { + return; + } + if (!mBuffer.isDone()) { + mBuffer.write(sender); + sem_post(&mBufferSem); + } +} diff --git a/tools/gator/daemon/ExternalSource.h b/tools/gator/daemon/ExternalSource.h new file mode 100644 index 00000000..919e75e8 --- /dev/null +++ b/tools/gator/daemon/ExternalSource.h @@ -0,0 +1,53 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef EXTERNALSOURCE_H +#define EXTERNALSOURCE_H + +#include + +#include "Buffer.h" +#include "Monitor.h" +#include "OlySocket.h" +#include "Source.h" + +// Counters from external sources like graphics drivers and annotations +class ExternalSource : public Source { +public: + ExternalSource(sem_t *senderSem); + ~ExternalSource(); + + bool prepare(); + void run(); + void interrupt(); + + bool isDone(); + void write(Sender *sender); + +private: + void waitFor(const int bytes); + void configureConnection(const int fd, const char *const handshake, size_t size); + bool connectMali(); + bool connectMve(); + + sem_t mBufferSem; + Buffer mBuffer; + Monitor mMonitor; + OlyServerSocket mMveStartupUds; + OlyServerSocket mMaliStartupUds; + OlyServerSocket mAnnotate; + int mInterruptFd; + int mMaliUds; + int mMveUds; + + // Intentionally unimplemented + ExternalSource(const ExternalSource &); + ExternalSource &operator=(const ExternalSource &); +}; + +#endif // EXTERNALSOURCE_H diff --git a/tools/gator/daemon/FSDriver.cpp b/tools/gator/daemon/FSDriver.cpp new file mode 100644 index 00000000..dd8eb804 --- /dev/null +++ b/tools/gator/daemon/FSDriver.cpp @@ -0,0 +1,158 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "FSDriver.h" + +#include +#include +#include +#include +#include + +#include "DriverSource.h" +#include "Logging.h" + +class FSCounter : public DriverCounter { +public: + FSCounter(DriverCounter *next, char *name, char *path, const char *regex); + ~FSCounter(); + + const char *getPath() const { return mPath; } + + int64_t read(); + +private: + char *const mPath; + regex_t mReg; + bool mUseRegex; + + // Intentionally unimplemented + FSCounter(const FSCounter &); + FSCounter &operator=(const FSCounter &); +}; + +FSCounter::FSCounter(DriverCounter *next, char *name, char *path, const char *regex) : DriverCounter(next, name), mPath(path), mUseRegex(regex != NULL) { + if (mUseRegex) { + int result = regcomp(&mReg, regex, REG_EXTENDED); + if (result != 0) { + char buf[128]; + regerror(result, &mReg, buf, sizeof(buf)); + logg->logError(__FILE__, __LINE__, "Invalid regex '%s': %s", regex, buf); + handleException(); + } + } +} + +FSCounter::~FSCounter() { + free(mPath); + if (mUseRegex) { + regfree(&mReg); + } +} + +int64_t FSCounter::read() { + int64_t value; + if (mUseRegex) { + char buf[4096]; + size_t pos = 0; + const int fd = open(mPath, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + goto fail; + } + while (pos < sizeof(buf) - 1) { + const ssize_t bytes = ::read(fd, buf + pos, sizeof(buf) - pos - 1); + if (bytes < 0) { + goto fail; + } else if (bytes == 0) { + break; + } + pos += bytes; + } + close(fd); + buf[pos] = '\0'; + + regmatch_t match[2]; + int result = regexec(&mReg, buf, 2, match, 0); + if (result != 0) { + regerror(result, &mReg, buf, sizeof(buf)); + logg->logError(__FILE__, __LINE__, "Parsing %s failed: %s", mPath, buf); + handleException(); + } + + if (match[1].rm_so < 0) { + logg->logError(__FILE__, __LINE__, "Parsing %s failed", mPath); + handleException(); + } + + errno = 0; + value = strtoll(buf + match[1].rm_so, NULL, 0); + if (errno != 0) { + logg->logError(__FILE__, __LINE__, "Parsing %s failed: %s", mPath, strerror(errno)); + handleException(); + } + } else { + if (DriverSource::readInt64Driver(mPath, &value) != 0) { + goto fail; + } + } + return value; + + fail: + logg->logError(__FILE__, __LINE__, "Unable to read %s", mPath); + handleException(); +} + +FSDriver::FSDriver() { +} + +FSDriver::~FSDriver() { +} + +void FSDriver::readEvents(mxml_node_t *const xml) { + mxml_node_t *node = xml; + while (true) { + node = mxmlFindElement(node, xml, "event", NULL, NULL, MXML_DESCEND); + if (node == NULL) { + break; + } + const char *counter = mxmlElementGetAttr(node, "counter"); + if (counter == NULL) { + continue; + } + + if (counter[0] == '/') { + logg->logError(__FILE__, __LINE__, "Old style filesystem counter (%s) detected, please create a new unique counter value and move the filename into the path attribute, see events-Filesystem.xml for examples", counter); + handleException(); + } + + if (strncmp(counter, "filesystem_", 11) != 0) { + continue; + } + + const char *path = mxmlElementGetAttr(node, "path"); + if (path == NULL) { + logg->logError(__FILE__, __LINE__, "The filesystem counter %s is missing the required path attribute", counter); + handleException(); + } + const char *regex = mxmlElementGetAttr(node, "regex"); + setCounters(new FSCounter(getCounters(), strdup(counter), strdup(path), regex)); + } +} + +int FSDriver::writeCounters(mxml_node_t *root) const { + int count = 0; + for (FSCounter *counter = static_cast(getCounters()); counter != NULL; counter = static_cast(counter->getNext())) { + if (access(counter->getPath(), R_OK) == 0) { + mxml_node_t *node = mxmlNewElement(root, "counter"); + mxmlElementSetAttr(node, "name", counter->getName()); + ++count; + } + } + + return count; +} diff --git a/tools/gator/daemon/FSDriver.h b/tools/gator/daemon/FSDriver.h new file mode 100644 index 00000000..a7dc8b4d --- /dev/null +++ b/tools/gator/daemon/FSDriver.h @@ -0,0 +1,29 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef FSDRIVER_H +#define FSDRIVER_H + +#include "Driver.h" + +class FSDriver : public PolledDriver { +public: + FSDriver(); + ~FSDriver(); + + void readEvents(mxml_node_t *const xml); + + int writeCounters(mxml_node_t *root) const; + +private: + // Intentionally unimplemented + FSDriver(const FSDriver &); + FSDriver &operator=(const FSDriver &); +}; + +#endif // FSDRIVER_H diff --git a/tools/gator/daemon/Fifo.cpp b/tools/gator/daemon/Fifo.cpp new file mode 100644 index 00000000..41275fd2 --- /dev/null +++ b/tools/gator/daemon/Fifo.cpp @@ -0,0 +1,127 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Fifo.h" + +#include + +#include "Logging.h" + +// bufferSize is the amount of data to be filled +// singleBufferSize is the maximum size that may be filled during a single write +// (bufferSize + singleBufferSize) will be allocated +Fifo::Fifo(int singleBufferSize, int bufferSize, sem_t* readerSem) { + mWrite = mRead = mReadCommit = mRaggedEnd = 0; + mWrapThreshold = bufferSize; + mSingleBufferSize = singleBufferSize; + mReaderSem = readerSem; + mBuffer = (char*)malloc(bufferSize + singleBufferSize); + mEnd = false; + + if (mBuffer == NULL) { + logg->logError(__FILE__, __LINE__, "failed to allocate %d bytes", bufferSize + singleBufferSize); + handleException(); + } + + if (sem_init(&mWaitForSpaceSem, 0, 0)) { + logg->logError(__FILE__, __LINE__, "sem_init() failed"); + handleException(); + } +} + +Fifo::~Fifo() { + free(mBuffer); + sem_destroy(&mWaitForSpaceSem); +} + +int Fifo::numBytesFilled() const { + return mWrite - mRead + mRaggedEnd; +} + +char* Fifo::start() const { + return mBuffer; +} + +bool Fifo::isEmpty() const { + return mRead == mWrite && mRaggedEnd == 0; +} + +bool Fifo::isFull() const { + return willFill(0); +} + +// Determines if the buffer will fill assuming 'additional' bytes will be added to the buffer +// 'full' means there is less than singleBufferSize bytes available contiguously; it does not mean there are zero bytes available +bool Fifo::willFill(int additional) const { + if (mWrite > mRead) { + if (numBytesFilled() + additional < mWrapThreshold) { + return false; + } + } else { + if (numBytesFilled() + additional < mWrapThreshold - mSingleBufferSize) { + return false; + } + } + return true; +} + +// This function will stall until contiguous singleBufferSize bytes are available +char* Fifo::write(int length) { + if (length <= 0) { + length = 0; + mEnd = true; + } + + // update the write pointer + mWrite += length; + + // handle the wrap-around + if (mWrite >= mWrapThreshold) { + mRaggedEnd = mWrite; + mWrite = 0; + } + + // send a notification that data is ready + sem_post(mReaderSem); + + // wait for space + while (isFull()) { + sem_wait(&mWaitForSpaceSem); + } + + return &mBuffer[mWrite]; +} + +void Fifo::release() { + // update the read pointer now that the data has been handled + mRead = mReadCommit; + + // handle the wrap-around + if (mRead >= mWrapThreshold) { + mRaggedEnd = mRead = mReadCommit = 0; + } + + // send a notification that data is free (space is available) + sem_post(&mWaitForSpaceSem); +} + +// This function will return null if no data is available +char* Fifo::read(int *const length) { + // wait for data + if (isEmpty() && !mEnd) { + return NULL; + } + + // obtain the length + do { + mReadCommit = mRaggedEnd ? mRaggedEnd : mWrite; + *length = mReadCommit - mRead; + } while (*length < 0); // plugs race condition without using semaphores + + return &mBuffer[mRead]; +} diff --git a/tools/gator/daemon/Fifo.h b/tools/gator/daemon/Fifo.h new file mode 100644 index 00000000..21c8d858 --- /dev/null +++ b/tools/gator/daemon/Fifo.h @@ -0,0 +1,48 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __FIFO_H__ +#define __FIFO_H__ + +#ifdef WIN32 +#include +#define sem_t HANDLE +#define sem_init(sem, pshared, value) ((*(sem) = CreateSemaphore(NULL, value, LONG_MAX, NULL)) == NULL) +#define sem_wait(sem) WaitForSingleObject(*(sem), INFINITE) +#define sem_post(sem) ReleaseSemaphore(*(sem), 1, NULL) +#define sem_destroy(sem) CloseHandle(*(sem)) +#else +#include +#endif + +class Fifo { +public: + Fifo(int singleBufferSize, int totalBufferSize, sem_t* readerSem); + ~Fifo(); + int numBytesFilled() const; + bool isEmpty() const; + bool isFull() const; + bool willFill(int additional) const; + char* start() const; + char* write(int length); + void release(); + char* read(int *const length); + +private: + int mSingleBufferSize, mWrite, mRead, mReadCommit, mRaggedEnd, mWrapThreshold; + sem_t mWaitForSpaceSem; + sem_t* mReaderSem; + char* mBuffer; + bool mEnd; + + // Intentionally unimplemented + Fifo(const Fifo &); + Fifo &operator=(const Fifo &); +}; + +#endif //__FIFO_H__ diff --git a/tools/gator/daemon/FtraceDriver.cpp b/tools/gator/daemon/FtraceDriver.cpp new file mode 100644 index 00000000..b156f1c0 --- /dev/null +++ b/tools/gator/daemon/FtraceDriver.cpp @@ -0,0 +1,118 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "FtraceDriver.h" + +#include + +#include "Logging.h" + +class FtraceCounter : public DriverCounter { +public: + FtraceCounter(DriverCounter *next, char *name, const char *regex); + ~FtraceCounter(); + + int read(const char *const line, int64_t *values); + +private: + regex_t reg; + + // Intentionally unimplemented + FtraceCounter(const FtraceCounter &); + FtraceCounter &operator=(const FtraceCounter &); +}; + +FtraceCounter::FtraceCounter(DriverCounter *next, char *name, const char *regex) : DriverCounter(next, name) { + int result = regcomp(®, regex, REG_EXTENDED); + if (result != 0) { + char buf[128]; + regerror(result, ®, buf, sizeof(buf)); + logg->logError(__FILE__, __LINE__, "Invalid regex '%s': %s", regex, buf); + handleException(); + } +} + +FtraceCounter::~FtraceCounter() { + regfree(®); +} + +int FtraceCounter::read(const char *const line, int64_t *values) { + regmatch_t match[2]; + int result = regexec(®, line, 2, match, 0); + if (result != 0) { + // No match + return 0; + } + + if (match[1].rm_so < 0) { + logg->logError(__FILE__, __LINE__, "Parsing %s failed", getName()); + handleException(); + } + + errno = 0; + int64_t value = strtoll(line + match[1].rm_so, NULL, 0); + if (errno != 0) { + logg->logError(__FILE__, __LINE__, "Parsing %s failed: %s", getName(), strerror(errno)); + handleException(); + } + + values[0] = getKey(); + values[1] = value; + + return 1; +} + +FtraceDriver::FtraceDriver() : mValues(NULL) { +} + +FtraceDriver::~FtraceDriver() { + delete [] mValues; +} + +void FtraceDriver::readEvents(mxml_node_t *const xml) { + mxml_node_t *node = xml; + int count = 0; + while (true) { + node = mxmlFindElement(node, xml, "event", NULL, NULL, MXML_DESCEND); + if (node == NULL) { + break; + } + const char *counter = mxmlElementGetAttr(node, "counter"); + if (counter == NULL) { + continue; + } + + if (strncmp(counter, "ftrace_", 7) != 0) { + continue; + } + + const char *regex = mxmlElementGetAttr(node, "regex"); + if (regex == NULL) { + logg->logError(__FILE__, __LINE__, "The regex counter %s is missing the required regex attribute", counter); + handleException(); + } + setCounters(new FtraceCounter(getCounters(), strdup(counter), regex)); + ++count; + } + + mValues = new int64_t[2*count]; +} + +int FtraceDriver::read(const char *line, int64_t **buf) { + int count = 0; + + for (FtraceCounter *counter = static_cast(getCounters()); counter != NULL; counter = static_cast(counter->getNext())) { + if (!counter->isEnabled()) { + continue; + } + count += counter->read(line, mValues + 2*count); + } + + *buf = mValues; + return count; +} diff --git a/tools/gator/daemon/FtraceDriver.h b/tools/gator/daemon/FtraceDriver.h new file mode 100644 index 00000000..5f958bec --- /dev/null +++ b/tools/gator/daemon/FtraceDriver.h @@ -0,0 +1,31 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef FTRACEDRIVER_H +#define FTRACEDRIVER_H + +#include "Driver.h" + +class FtraceDriver : public SimpleDriver { +public: + FtraceDriver(); + ~FtraceDriver(); + + void readEvents(mxml_node_t *const xml); + + int read(const char *line, int64_t **buf); + +private: + int64_t *mValues; + + // Intentionally unimplemented + FtraceDriver(const FtraceDriver &); + FtraceDriver &operator=(const FtraceDriver &); +}; + +#endif // FTRACEDRIVER_H diff --git a/tools/gator/daemon/FtraceSource.cpp b/tools/gator/daemon/FtraceSource.cpp new file mode 100644 index 00000000..52163335 --- /dev/null +++ b/tools/gator/daemon/FtraceSource.cpp @@ -0,0 +1,158 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "FtraceSource.h" + +#include +#include +#include +#include +#include + +#include "DriverSource.h" +#include "Logging.h" +#include "SessionData.h" + +static void handler(int signum) +{ + (void)signum; +}; + +FtraceSource::FtraceSource(sem_t *senderSem) : mFtraceFh(NULL), mBuffer(0, FRAME_BLOCK_COUNTER, 128*1024, senderSem), mTid(-1), mTracingOn(0) { +} + +FtraceSource::~FtraceSource() { +} + +bool FtraceSource::prepare() { + { + struct sigaction act; + act.sa_handler = handler; + act.sa_flags = (int)SA_RESETHAND; + if (sigaction(SIGUSR1, &act, NULL) != 0) { + logg->logError(__FILE__, __LINE__, "sigaction failed: %s\n", strerror(errno)); + handleException(); + } + } + + if (DriverSource::readIntDriver("/sys/kernel/debug/tracing/tracing_on", &mTracingOn)) { + logg->logError(__FILE__, __LINE__, "Unable to read if ftrace is enabled"); + handleException(); + } + + if (DriverSource::writeDriver("/sys/kernel/debug/tracing/tracing_on", "0") != 0) { + logg->logError(__FILE__, __LINE__, "Unable to turn ftrace off before truncating the buffer"); + handleException(); + } + + { + int fd; + fd = open("/sys/kernel/debug/tracing/trace", O_WRONLY | O_TRUNC | O_CLOEXEC, 0666); + if (fd < 0) { + logg->logError(__FILE__, __LINE__, "Unable truncate ftrace buffer: %s", strerror(errno)); + handleException(); + } + close(fd); + } + + if (DriverSource::writeDriver("/sys/kernel/debug/tracing/trace_clock", "perf") != 0) { + logg->logError(__FILE__, __LINE__, "Unable to switch ftrace to the perf clock, please ensure you are running Linux 3.10 or later"); + handleException(); + } + + mFtraceFh = fopen_cloexec("/sys/kernel/debug/tracing/trace_pipe", "rb"); + if (mFtraceFh == NULL) { + logg->logError(__FILE__, __LINE__, "Unable to open trace_pipe"); + handleException(); + } + + return true; +} + +void FtraceSource::run() { + prctl(PR_SET_NAME, (unsigned long)&"gatord-ftrace", 0, 0, 0); + mTid = syscall(__NR_gettid); + + if (DriverSource::writeDriver("/sys/kernel/debug/tracing/tracing_on", "1") != 0) { + logg->logError(__FILE__, __LINE__, "Unable to turn ftrace on"); + handleException(); + } + + while (gSessionData->mSessionIsActive) { + char buf[1<<12]; + + if (fgets(buf, sizeof(buf), mFtraceFh) == NULL) { + if (errno == EINTR) { + // Interrupted by interrupt - likely user request to terminate + break; + } + logg->logError(__FILE__, __LINE__, "Unable read trace data: %s", strerror(errno)); + handleException(); + } + + const uint64_t currTime = getTime(); + + char *const colon = strstr(buf, ": "); + if (colon == NULL) { + logg->logError(__FILE__, __LINE__, "Unable find colon: %s", buf); + handleException(); + } + *colon = '\0'; + + char *const space = strrchr(buf, ' '); + if (space == NULL) { + logg->logError(__FILE__, __LINE__, "Unable find space: %s", buf); + handleException(); + } + *colon = ':'; + + int64_t *data = NULL; + int count = gSessionData->ftraceDriver.read(colon + 2, &data); + if (count > 0) { + errno = 0; + const long long time = strtod(space, NULL) * 1000000000; + if (errno != 0) { + logg->logError(__FILE__, __LINE__, "Unable to parse time: %s", strerror(errno)); + handleException(); + } + mBuffer.event64(-1, time); + + for (int i = 0; i < count; ++i) { + mBuffer.event64(data[2*i + 0], data[2*i + 1]); + } + + mBuffer.check(currTime); + } + + } + + mBuffer.setDone(); + + DriverSource::writeDriver("/sys/kernel/debug/tracing/tracing_on", mTracingOn); + fclose(mFtraceFh); + DriverSource::writeDriver("/sys/kernel/debug/tracing/trace_clock", "local"); +} + +void FtraceSource::interrupt() { + // Closing the underlying file handle does not result in the read on the ftrace file handle to return, so send a signal to the thread + syscall(__NR_tgkill, getpid(), mTid, SIGUSR1); +} + +bool FtraceSource::isDone() { + return mBuffer.isDone(); +} + +void FtraceSource::write(Sender *sender) { + // Don't send ftrace data until the summary packet is sent so that monotonic delta is available + if (!gSessionData->mSentSummary) { + return; + } + if (!mBuffer.isDone()) { + mBuffer.write(sender); + } +} diff --git a/tools/gator/daemon/FtraceSource.h b/tools/gator/daemon/FtraceSource.h new file mode 100644 index 00000000..2391b881 --- /dev/null +++ b/tools/gator/daemon/FtraceSource.h @@ -0,0 +1,43 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef FTRACESOURCE_H +#define FTRACESOURCE_H + +#include +#include + +#include "Buffer.h" +#include "Source.h" + +class FtraceSource : public Source { +public: + FtraceSource(sem_t *senderSem); + ~FtraceSource(); + + bool prepare(); + void run(); + void interrupt(); + + bool isDone(); + void write(Sender *sender); + +private: + void waitFor(const int bytes); + + FILE *mFtraceFh; + Buffer mBuffer; + int mTid; + int mTracingOn; + + // Intentionally unimplemented + FtraceSource(const FtraceSource &); + FtraceSource &operator=(const FtraceSource &); +}; + +#endif // FTRACESOURCE_H diff --git a/tools/gator/daemon/HwmonDriver.cpp b/tools/gator/daemon/HwmonDriver.cpp new file mode 100644 index 00000000..9d161ae5 --- /dev/null +++ b/tools/gator/daemon/HwmonDriver.cpp @@ -0,0 +1,245 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "HwmonDriver.h" + +#include "libsensors/sensors.h" + +#include "Logging.h" + +// feature->type to input map +static sensors_subfeature_type getInput(const sensors_feature_type type) { + switch (type) { + case SENSORS_FEATURE_IN: return SENSORS_SUBFEATURE_IN_INPUT; + case SENSORS_FEATURE_FAN: return SENSORS_SUBFEATURE_FAN_INPUT; + case SENSORS_FEATURE_TEMP: return SENSORS_SUBFEATURE_TEMP_INPUT; + case SENSORS_FEATURE_POWER: return SENSORS_SUBFEATURE_POWER_INPUT; + case SENSORS_FEATURE_ENERGY: return SENSORS_SUBFEATURE_ENERGY_INPUT; + case SENSORS_FEATURE_CURR: return SENSORS_SUBFEATURE_CURR_INPUT; + case SENSORS_FEATURE_HUMIDITY: return SENSORS_SUBFEATURE_HUMIDITY_INPUT; + default: + logg->logError(__FILE__, __LINE__, "Unsupported hwmon feature %i", type); + handleException(); + } +}; + +class HwmonCounter : public DriverCounter { +public: + HwmonCounter(DriverCounter *next, char *const name, const sensors_chip_name *chip, const sensors_feature *feature); + ~HwmonCounter(); + + const char *getLabel() const { return label; } + const char *getTitle() const { return title; } + bool isDuplicate() const { return duplicate; } + const char *getDisplay() const { return display; } + const char *getCounterClass() const { return counter_class; } + const char *getUnit() const { return unit; } + int getModifier() const { return modifier; } + + int64_t read(); + +private: + void init(const sensors_chip_name *chip, const sensors_feature *feature); + + const sensors_chip_name *chip; + const sensors_feature *feature; + char *label; + const char *title; + const char *display; + const char *counter_class; + const char *unit; + double previous_value; + int modifier; + int monotonic: 1, + duplicate : 1; + + // Intentionally unimplemented + HwmonCounter(const HwmonCounter &); + HwmonCounter &operator=(const HwmonCounter &); +}; + +HwmonCounter::HwmonCounter(DriverCounter *next, char *const name, const sensors_chip_name *chip, const sensors_feature *feature) : DriverCounter(next, name), chip(chip), feature(feature), duplicate(false) { + label = sensors_get_label(chip, feature); + + switch (feature->type) { + case SENSORS_FEATURE_IN: + title = "Voltage"; + display = "maximum"; + counter_class = "absolute"; + unit = "V"; + modifier = 1000; + monotonic = false; + break; + case SENSORS_FEATURE_FAN: + title = "Fan"; + display = "average"; + counter_class = "absolute"; + unit = "RPM"; + modifier = 1; + monotonic = false; + break; + case SENSORS_FEATURE_TEMP: + title = "Temperature"; + display = "maximum"; + counter_class = "absolute"; + unit = "°C"; + modifier = 1000; + monotonic = false; + break; + case SENSORS_FEATURE_POWER: + title = "Power"; + display = "maximum"; + counter_class = "absolute"; + unit = "W"; + modifier = 1000000; + monotonic = false; + break; + case SENSORS_FEATURE_ENERGY: + title = "Energy"; + display = "accumulate"; + counter_class = "delta"; + unit = "J"; + modifier = 1000000; + monotonic = true; + break; + case SENSORS_FEATURE_CURR: + title = "Current"; + display = "maximum"; + counter_class = "absolute"; + unit = "A"; + modifier = 1000; + monotonic = false; + break; + case SENSORS_FEATURE_HUMIDITY: + title = "Humidity"; + display = "average"; + counter_class = "absolute"; + unit = "%"; + modifier = 1000; + monotonic = false; + break; + default: + logg->logError(__FILE__, __LINE__, "Unsupported hwmon feature %i", feature->type); + handleException(); + } + + for (HwmonCounter * counter = static_cast(next); counter != NULL; counter = static_cast(counter->getNext())) { + if (strcmp(label, counter->getLabel()) == 0 && strcmp(title, counter->getTitle()) == 0) { + duplicate = true; + counter->duplicate = true; + break; + } + } +} + +HwmonCounter::~HwmonCounter() { + free((void *)label); +} + +int64_t HwmonCounter::read() { + double value; + double result; + const sensors_subfeature *subfeature; + + // Keep in sync with the read check in HwmonDriver::readEvents + subfeature = sensors_get_subfeature(chip, feature, getInput(feature->type)); + if (!subfeature) { + logg->logError(__FILE__, __LINE__, "No input value for hwmon sensor %s", label); + handleException(); + } + + if (sensors_get_value(chip, subfeature->number, &value) != 0) { + logg->logError(__FILE__, __LINE__, "Can't get input value for hwmon sensor %s", label); + handleException(); + } + + result = (monotonic ? value - previous_value : value); + previous_value = value; + + return result; +} + +HwmonDriver::HwmonDriver() { +} + +HwmonDriver::~HwmonDriver() { + sensors_cleanup(); +} + +void HwmonDriver::readEvents(mxml_node_t *const) { + int err = sensors_init(NULL); + if (err) { + logg->logMessage("Failed to initialize libsensors! (%d)", err); + return; + } + sensors_sysfs_no_scaling = 1; + + int chip_nr = 0; + const sensors_chip_name *chip; + while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) { + int feature_nr = 0; + const sensors_feature *feature; + while ((feature = sensors_get_features(chip, &feature_nr))) { + // Keep in sync with HwmonCounter::read + // Can this counter be read? + double value; + const sensors_subfeature *const subfeature = sensors_get_subfeature(chip, feature, getInput(feature->type)); + if ((subfeature == NULL) || (sensors_get_value(chip, subfeature->number, &value) != 0)) { + continue; + } + + // Get the name of the counter + int len = sensors_snprintf_chip_name(NULL, 0, chip) + 1; + char *chip_name = new char[len]; + sensors_snprintf_chip_name(chip_name, len, chip); + len = snprintf(NULL, 0, "hwmon_%s_%d_%d", chip_name, chip_nr, feature->number) + 1; + char *const name = new char[len]; + snprintf(name, len, "hwmon_%s_%d_%d", chip_name, chip_nr, feature->number); + delete [] chip_name; + + setCounters(new HwmonCounter(getCounters(), name, chip, feature)); + } + } +} + +void HwmonDriver::writeEvents(mxml_node_t *root) const { + root = mxmlNewElement(root, "category"); + mxmlElementSetAttr(root, "name", "hwmon"); + + char buf[1024]; + for (HwmonCounter *counter = static_cast(getCounters()); counter != NULL; counter = static_cast(counter->getNext())) { + mxml_node_t *node = mxmlNewElement(root, "event"); + mxmlElementSetAttr(node, "counter", counter->getName()); + mxmlElementSetAttr(node, "title", counter->getTitle()); + if (counter->isDuplicate()) { + mxmlElementSetAttrf(node, "name", "%s (0x%x)", counter->getLabel(), counter->getKey()); + } else { + mxmlElementSetAttr(node, "name", counter->getLabel()); + } + mxmlElementSetAttr(node, "display", counter->getDisplay()); + mxmlElementSetAttr(node, "class", counter->getCounterClass()); + mxmlElementSetAttr(node, "units", counter->getUnit()); + if (counter->getModifier() != 1) { + mxmlElementSetAttrf(node, "modifier", "%d", counter->getModifier()); + } + if (strcmp(counter->getDisplay(), "average") == 0 || strcmp(counter->getDisplay(), "maximum") == 0) { + mxmlElementSetAttr(node, "average_selection", "yes"); + } + snprintf(buf, sizeof(buf), "libsensors %s sensor %s (%s)", counter->getTitle(), counter->getLabel(), counter->getName()); + mxmlElementSetAttr(node, "description", buf); + } +} + +void HwmonDriver::start() { + for (DriverCounter *counter = getCounters(); counter != NULL; counter = counter->getNext()) { + if (!counter->isEnabled()) { + continue; + } + counter->read(); + } +} diff --git a/tools/gator/daemon/HwmonDriver.h b/tools/gator/daemon/HwmonDriver.h new file mode 100644 index 00000000..f28d825e --- /dev/null +++ b/tools/gator/daemon/HwmonDriver.h @@ -0,0 +1,31 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef HWMONDRIVER_H +#define HWMONDRIVER_H + +#include "Driver.h" + +class HwmonDriver : public PolledDriver { +public: + HwmonDriver(); + ~HwmonDriver(); + + void readEvents(mxml_node_t *const root); + + void writeEvents(mxml_node_t *root) const; + + void start(); + +private: + // Intentionally unimplemented + HwmonDriver(const HwmonDriver &); + HwmonDriver &operator=(const HwmonDriver &); +}; + +#endif // HWMONDRIVER_H diff --git a/tools/gator/daemon/KMod.cpp b/tools/gator/daemon/KMod.cpp new file mode 100644 index 00000000..fe9dc6a7 --- /dev/null +++ b/tools/gator/daemon/KMod.cpp @@ -0,0 +1,119 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "KMod.h" + +#include +#include +#include + +#include "ConfigurationXML.h" +#include "Counter.h" +#include "DriverSource.h" +#include "Logging.h" +#include "SessionData.h" + +// Claim all the counters in /dev/gator/events +bool KMod::claimCounter(const Counter &counter) const { + char text[128]; + snprintf(text, sizeof(text), "/dev/gator/events/%s", counter.getType()); + return access(text, F_OK) == 0; +} + +void KMod::resetCounters() { + char base[128]; + char text[128]; + + // Initialize all perf counters in the driver, i.e. set enabled to zero + struct dirent *ent; + DIR* dir = opendir("/dev/gator/events"); + if (dir) { + while ((ent = readdir(dir)) != NULL) { + // skip hidden files, current dir, and parent dir + if (ent->d_name[0] == '.') + continue; + snprintf(base, sizeof(base), "/dev/gator/events/%s", ent->d_name); + snprintf(text, sizeof(text), "%s/enabled", base); + DriverSource::writeDriver(text, 0); + snprintf(text, sizeof(text), "%s/count", base); + DriverSource::writeDriver(text, 0); + } + closedir(dir); + } +} + +static const char ARM_MALI_MIDGARD[] = "ARM_Mali-Midgard_"; +static const char ARM_MALI_T[] = "ARM_Mali-T"; + +void KMod::setupCounter(Counter &counter) { + char base[128]; + char text[128]; + snprintf(base, sizeof(base), "/dev/gator/events/%s", counter.getType()); + + if ((strncmp(counter.getType(), ARM_MALI_MIDGARD, sizeof(ARM_MALI_MIDGARD) - 1) == 0 || + strncmp(counter.getType(), ARM_MALI_T, sizeof(ARM_MALI_T) - 1) == 0)) { + mIsMaliCapture = true; + } + + snprintf(text, sizeof(text), "%s/enabled", base); + int enabled = true; + if (DriverSource::writeReadDriver(text, &enabled) || !enabled) { + counter.setEnabled(false); + return; + } + + int value = 0; + snprintf(text, sizeof(text), "%s/key", base); + DriverSource::readIntDriver(text, &value); + counter.setKey(value); + + snprintf(text, sizeof(text), "%s/cores", base); + if (DriverSource::readIntDriver(text, &value) == 0) { + counter.setCores(value); + } + + snprintf(text, sizeof(text), "%s/event", base); + DriverSource::writeDriver(text, counter.getEvent()); + snprintf(text, sizeof(text), "%s/count", base); + if (access(text, F_OK) == 0) { + int count = counter.getCount(); + if (DriverSource::writeReadDriver(text, &count) && counter.getCount() > 0) { + logg->logError(__FILE__, __LINE__, "Cannot enable EBS for %s:%i with a count of %d\n", counter.getType(), counter.getEvent(), counter.getCount()); + handleException(); + } + counter.setCount(count); + } else if (counter.getCount() > 0) { + ConfigurationXML::remove(); + logg->logError(__FILE__, __LINE__, "Event Based Sampling is only supported with kernel versions 3.0.0 and higher with CONFIG_PERF_EVENTS=y, and CONFIG_HW_PERF_EVENTS=y. The invalid configuration.xml has been removed.\n"); + handleException(); + } +} + +int KMod::writeCounters(mxml_node_t *root) const { + struct dirent *ent; + mxml_node_t *counter; + + // counters.xml is simply a file listing of /dev/gator/events + DIR* dir = opendir("/dev/gator/events"); + if (dir == NULL) { + return 0; + } + + int count = 0; + while ((ent = readdir(dir)) != NULL) { + // skip hidden files, current dir, and parent dir + if (ent->d_name[0] == '.') + continue; + counter = mxmlNewElement(root, "counter"); + mxmlElementSetAttr(counter, "name", ent->d_name); + ++count; + } + closedir(dir); + + return count; +} diff --git a/tools/gator/daemon/KMod.h b/tools/gator/daemon/KMod.h new file mode 100644 index 00000000..900a60e8 --- /dev/null +++ b/tools/gator/daemon/KMod.h @@ -0,0 +1,32 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef KMOD_H +#define KMOD_H + +#include "Driver.h" + +// Driver for the gator kernel module +class KMod : public Driver { +public: + KMod() : mIsMaliCapture(false) {} + ~KMod() {} + + bool claimCounter(const Counter &counter) const; + void resetCounters(); + void setupCounter(Counter &counter); + + int writeCounters(mxml_node_t *root) const; + + bool isMaliCapture() const { return mIsMaliCapture; } + +private: + bool mIsMaliCapture; +}; + +#endif // KMOD_H diff --git a/tools/gator/daemon/LocalCapture.cpp b/tools/gator/daemon/LocalCapture.cpp new file mode 100644 index 00000000..d2a4b799 --- /dev/null +++ b/tools/gator/daemon/LocalCapture.cpp @@ -0,0 +1,131 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "LocalCapture.h" + +#include +#include +#include +#include +#include +#include + +#include "SessionData.h" +#include "Logging.h" +#include "OlyUtility.h" +#include "EventsXML.h" + +LocalCapture::LocalCapture() {} + +LocalCapture::~LocalCapture() {} + +void LocalCapture::createAPCDirectory(char* target_path) { + gSessionData->mAPCDir = createUniqueDirectory(target_path, ".apc"); + if ((removeDirAndAllContents(gSessionData->mAPCDir) != 0 || mkdir(gSessionData->mAPCDir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)) { + logg->logError(__FILE__, __LINE__, "Unable to create directory %s", gSessionData->mAPCDir); + handleException(); + } +} + +void LocalCapture::write(char* string) { + char file[PATH_MAX]; + + // Set full path + snprintf(file, PATH_MAX, "%s/session.xml", gSessionData->mAPCDir); + + // Write the file + if (util->writeToDisk(file, string) < 0) { + logg->logError(__FILE__, __LINE__, "Error writing %s\nPlease verify the path.", file); + handleException(); + } + + // Write events XML + EventsXML eventsXML; + eventsXML.write(gSessionData->mAPCDir); +} + +char* LocalCapture::createUniqueDirectory(const char* initialPath, const char* ending) { + char* output; + char path[PATH_MAX]; + + // Ensure the path is an absolute path, i.e. starts with a slash + if (initialPath == 0 || strlen(initialPath) == 0) { + logg->logError(__FILE__, __LINE__, "Missing -o command line option required for a local capture."); + handleException(); + } else if (initialPath[0] != '/') { + if (getcwd(path, PATH_MAX) == 0) { + logg->logMessage("Unable to retrieve the current working directory"); + } + strncat(path, "/", PATH_MAX - strlen(path) - 1); + strncat(path, initialPath, PATH_MAX - strlen(path) - 1); + } else { + strncpy(path, initialPath, PATH_MAX); + path[PATH_MAX - 1] = 0; // strncpy does not guarantee a null-terminated string + } + + // Add ending if it is not already there + if (strcmp(&path[strlen(path) - strlen(ending)], ending) != 0) { + strncat(path, ending, PATH_MAX - strlen(path) - 1); + } + + output = strdup(path); + + return output; +} + +int LocalCapture::removeDirAndAllContents(char* path) { + int error = 0; + struct stat mFileInfo; + // Does the path exist? + if (stat(path, &mFileInfo) == 0) { + // Is it a directory? + if (mFileInfo.st_mode & S_IFDIR) { + DIR * dir = opendir(path); + dirent* entry = readdir(dir); + while (entry) { + if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { + char* newpath = (char*)malloc(strlen(path) + strlen(entry->d_name) + 2); + sprintf(newpath, "%s/%s", path, entry->d_name); + error = removeDirAndAllContents(newpath); + free(newpath); + if (error) { + break; + } + } + entry = readdir(dir); + } + closedir(dir); + if (error == 0) { + error = rmdir(path); + } + } else { + error = remove(path); + } + } + return error; +} + +void LocalCapture::copyImages(ImageLinkList* ptr) { + char dstfilename[PATH_MAX]; + + while (ptr) { + strncpy(dstfilename, gSessionData->mAPCDir, PATH_MAX); + dstfilename[PATH_MAX - 1] = 0; // strncpy does not guarantee a null-terminated string + if (gSessionData->mAPCDir[strlen(gSessionData->mAPCDir) - 1] != '/') { + strncat(dstfilename, "/", PATH_MAX - strlen(dstfilename) - 1); + } + strncat(dstfilename, util->getFilePart(ptr->path), PATH_MAX - strlen(dstfilename) - 1); + if (util->copyFile(ptr->path, dstfilename)) { + logg->logMessage("copied file %s to %s", ptr->path, dstfilename); + } else { + logg->logMessage("copy of file %s to %s failed", ptr->path, dstfilename); + } + + ptr = ptr->next; + } +} diff --git a/tools/gator/daemon/LocalCapture.h b/tools/gator/daemon/LocalCapture.h new file mode 100644 index 00000000..25d281f8 --- /dev/null +++ b/tools/gator/daemon/LocalCapture.h @@ -0,0 +1,26 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LOCAL_CAPTURE_H__ +#define __LOCAL_CAPTURE_H__ + +struct ImageLinkList; + +class LocalCapture { +public: + LocalCapture(); + ~LocalCapture(); + void write(char* string); + void copyImages(ImageLinkList* ptr); + void createAPCDirectory(char* target_path); +private: + char* createUniqueDirectory(const char* path, const char* ending); + int removeDirAndAllContents(char* path); +}; + +#endif //__LOCAL_CAPTURE_H__ diff --git a/tools/gator/daemon/Logging.cpp b/tools/gator/daemon/Logging.cpp new file mode 100644 index 00000000..41ffa1a4 --- /dev/null +++ b/tools/gator/daemon/Logging.cpp @@ -0,0 +1,78 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Logging.h" + +#include +#include +#include +#include + +#ifdef WIN32 +#define MUTEX_INIT() mLoggingMutex = CreateMutex(NULL, false, NULL); +#define MUTEX_LOCK() WaitForSingleObject(mLoggingMutex, 0xFFFFFFFF); +#define MUTEX_UNLOCK() ReleaseMutex(mLoggingMutex); +#define snprintf _snprintf +#else +#include +#define MUTEX_INIT() pthread_mutex_init(&mLoggingMutex, NULL) +#define MUTEX_LOCK() pthread_mutex_lock(&mLoggingMutex) +#define MUTEX_UNLOCK() pthread_mutex_unlock(&mLoggingMutex) +#endif + +// Global thread-safe logging +Logging* logg = NULL; + +Logging::Logging(bool debug) { + mDebug = debug; + MUTEX_INIT(); + + strcpy(mErrBuf, "Unknown Error"); + strcpy(mLogBuf, "Unknown Message"); +} + +Logging::~Logging() { +} + +void Logging::logError(const char* file, int line, const char* fmt, ...) { + va_list args; + + MUTEX_LOCK(); + if (mDebug) { + snprintf(mErrBuf, sizeof(mErrBuf), "ERROR[%s:%d]: ", file, line); + } else { + mErrBuf[0] = 0; + } + + va_start(args, fmt); + vsnprintf(mErrBuf + strlen(mErrBuf), sizeof(mErrBuf) - 2 - strlen(mErrBuf), fmt, args); // subtract 2 for \n and \0 + va_end(args); + + if (strlen(mErrBuf) > 0) { + strcat(mErrBuf, "\n"); + } + MUTEX_UNLOCK(); +} + +void Logging::logMessage(const char* fmt, ...) { + if (mDebug) { + va_list args; + + MUTEX_LOCK(); + strcpy(mLogBuf, "INFO: "); + + va_start(args, fmt); + vsnprintf(mLogBuf + strlen(mLogBuf), sizeof(mLogBuf) - 2 - strlen(mLogBuf), fmt, args); // subtract 2 for \n and \0 + va_end(args); + strcat(mLogBuf, "\n"); + + fprintf(stdout, "%s", mLogBuf); + fflush(stdout); + MUTEX_UNLOCK(); + } +} diff --git a/tools/gator/daemon/Logging.h b/tools/gator/daemon/Logging.h new file mode 100644 index 00000000..09e93ff1 --- /dev/null +++ b/tools/gator/daemon/Logging.h @@ -0,0 +1,36 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __LOGGING_H__ +#define __LOGGING_H__ + +#include + +#define DRIVER_ERROR "\n Driver issue:\n >> gator.ko must be built against the current kernel version & configuration\n >> gator.ko should be co-located with gatord in the same directory\n >> OR insmod gator.ko prior to launching gatord" + +class Logging { +public: + Logging(bool debug); + ~Logging(); + void logError(const char* file, int line, const char* fmt, ...); + void logMessage(const char* fmt, ...); + char* getLastError() {return mErrBuf;} + char* getLastMessage() {return mLogBuf;} + +private: + char mErrBuf[4096]; // Arbitrarily large buffer to hold a string + char mLogBuf[4096]; // Arbitrarily large buffer to hold a string + bool mDebug; + pthread_mutex_t mLoggingMutex; +}; + +extern Logging* logg; + +extern void handleException() __attribute__ ((noreturn)); + +#endif //__LOGGING_H__ diff --git a/tools/gator/daemon/Makefile b/tools/gator/daemon/Makefile new file mode 100644 index 00000000..27531b43 --- /dev/null +++ b/tools/gator/daemon/Makefile @@ -0,0 +1,22 @@ +# +# Makefile for ARM Streamline - Gator Daemon +# + +# Uncomment and define CROSS_COMPILE if it is not already defined +# CROSS_COMPILE=/path/to/cross-compiler/arm-linux-gnueabihf- +# NOTE: This toolchain uses the hardfloat abi by default. For non-hardfloat +# targets run 'make SOFTFLOAT=1 SYSROOT=/path/to/sysroot', see +# README_Streamline.txt for more details + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ + +ifeq ($(SOFTFLOAT),1) + CPPFLAGS += -marm -mthumb-interwork -march=armv4t -mfloat-abi=soft + LDFLAGS += -marm -march=armv4t -mfloat-abi=soft +endif +ifneq ($(SYSROOT),) + LDFLAGS += --sysroot=$(SYSROOT) +endif + +include common.mk diff --git a/tools/gator/daemon/Makefile_aarch64 b/tools/gator/daemon/Makefile_aarch64 new file mode 100644 index 00000000..efd1fa00 --- /dev/null +++ b/tools/gator/daemon/Makefile_aarch64 @@ -0,0 +1,12 @@ +# +# Makefile for ARM Streamline - Gator Daemon +# make -f Makefile_aarch64 +# + +# Uncomment and define CROSS_COMPILE if it is not already defined +# CROSS_COMPILE=/path/to/cross-compiler/aarch64-linux-gnu- + +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ + +include common.mk diff --git a/tools/gator/daemon/MaliVideoDriver.cpp b/tools/gator/daemon/MaliVideoDriver.cpp new file mode 100644 index 00000000..5eef2643 --- /dev/null +++ b/tools/gator/daemon/MaliVideoDriver.cpp @@ -0,0 +1,191 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "MaliVideoDriver.h" + +#include + +#include "Buffer.h" +#include "Counter.h" +#include "Logging.h" +#include "SessionData.h" + +// From instr/src/mve_instr_comm_protocol.h +typedef enum mve_instr_configuration_type { + MVE_INSTR_RAW = 1 << 0, + MVE_INSTR_COUNTERS = 1 << 1, + MVE_INSTR_EVENTS = 1 << 2, + MVE_INSTR_ACTIVITIES = 1 << 3, + + // Raw always pushed regardless + MVE_INSTR_PULL = 1 << 12, + // Raw always unpacked regardless + MVE_INSTR_PACKED_COMM = 1 << 13, + // Don’t send ACKt response + MVE_INSTR_NO_AUTO_ACK = 1 << 14, +} mve_instr_configuration_type_t; + +static const char COUNTER[] = "ARM_Mali-V500_cnt"; +static const char EVENT[] = "ARM_Mali-V500_evn"; +static const char ACTIVITY[] = "ARM_Mali-V500_act"; + +class MaliVideoCounter : public DriverCounter { +public: + MaliVideoCounter(DriverCounter *next, const char *name, const MaliVideoCounterType type, const int id) : DriverCounter(next, name), mType(type), mId(id) { + } + + ~MaliVideoCounter() { + } + + MaliVideoCounterType getType() const { return mType; } + int getId() const { return mId; } + +private: + const MaliVideoCounterType mType; + // Mali Video id + const int mId; +}; + +MaliVideoDriver::MaliVideoDriver() { +} + +MaliVideoDriver::~MaliVideoDriver() { +} + +void MaliVideoDriver::readEvents(mxml_node_t *const xml) { + mxml_node_t *node = xml; + while (true) { + node = mxmlFindElement(node, xml, "event", NULL, NULL, MXML_DESCEND); + if (node == NULL) { + break; + } + const char *counter = mxmlElementGetAttr(node, "counter"); + if (counter == NULL) { + // Ignore + } else if (strncmp(counter, COUNTER, sizeof(COUNTER) - 1) == 0) { + const int i = strtol(counter + sizeof(COUNTER) - 1, NULL, 10); + setCounters(new MaliVideoCounter(getCounters(), strdup(counter), MVCT_COUNTER, i)); + } else if (strncmp(counter, EVENT, sizeof(EVENT) - 1) == 0) { + const int i = strtol(counter + sizeof(EVENT) - 1, NULL, 10); + setCounters(new MaliVideoCounter(getCounters(), strdup(counter), MVCT_EVENT, i)); + } else if (strncmp(counter, ACTIVITY, sizeof(ACTIVITY) - 1) == 0) { + const int i = strtol(counter + sizeof(ACTIVITY) - 1, NULL, 10); + setCounters(new MaliVideoCounter(getCounters(), strdup(counter), MVCT_ACTIVITY, i)); + } + } +} + +int MaliVideoDriver::writeCounters(mxml_node_t *root) const { + if (access("/dev/mv500", F_OK) != 0) { + return 0; + } + + return super::writeCounters(root); +} + +void MaliVideoDriver::marshalEnable(const MaliVideoCounterType type, char *const buf, const size_t bufsize, int &pos) { + // size + int numEnabled = 0; + for (MaliVideoCounter *counter = static_cast(getCounters()); counter != NULL; counter = static_cast(counter->getNext())) { + if (counter->isEnabled() && (counter->getType() == type)) { + ++numEnabled; + } + } + Buffer::packInt(buf, bufsize, pos, numEnabled*sizeof(uint32_t)); + for (MaliVideoCounter *counter = static_cast(getCounters()); counter != NULL; counter = static_cast(counter->getNext())) { + if (counter->isEnabled() && (counter->getType() == type)) { + Buffer::packInt(buf, bufsize, pos, counter->getId()); + } + } +} + +static bool writeAll(const int mveUds, const char *const buf, const int pos) { + int written = 0; + while (written < pos) { + size_t bytes = ::write(mveUds, buf + written, pos - written); + if (bytes <= 0) { + logg->logMessage("%s(%s:%i): write failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + written += bytes; + } + + return true; +} + +bool MaliVideoDriver::start(const int mveUds) { + char buf[256]; + int pos = 0; + + // code - MVE_INSTR_STARTUP + buf[pos++] = 'C'; + buf[pos++] = 'L'; + buf[pos++] = 'N'; + buf[pos++] = 'T'; + // size + Buffer::packInt(buf, sizeof(buf), pos, sizeof(uint32_t)); + // client_version_number + Buffer::packInt(buf, sizeof(buf), pos, 1); + + // code - MVE_INSTR_CONFIGURE + buf[pos++] = 'C'; + buf[pos++] = 'N'; + buf[pos++] = 'F'; + buf[pos++] = 'G'; + // size + Buffer::packInt(buf, sizeof(buf), pos, 5*sizeof(uint32_t)); + // configuration + Buffer::packInt(buf, sizeof(buf), pos, MVE_INSTR_COUNTERS | MVE_INSTR_EVENTS | MVE_INSTR_ACTIVITIES | MVE_INSTR_PACKED_COMM); + // communication_protocol_version + Buffer::packInt(buf, sizeof(buf), pos, 1); + // data_protocol_version + Buffer::packInt(buf, sizeof(buf), pos, 1); + // sample_rate - convert samples/second to ms/sample + Buffer::packInt(buf, sizeof(buf), pos, 1000/gSessionData->mSampleRate); + // live_rate - convert ns/flush to ms/flush + Buffer::packInt(buf, sizeof(buf), pos, gSessionData->mLiveRate/1000000); + + // code - MVE_INSTR_ENABLE_COUNTERS + buf[pos++] = 'C'; + buf[pos++] = 'F'; + buf[pos++] = 'G'; + buf[pos++] = 'c'; + marshalEnable(MVCT_COUNTER, buf, sizeof(buf), pos); + + // code - MVE_INSTR_ENABLE_EVENTS + buf[pos++] = 'C'; + buf[pos++] = 'F'; + buf[pos++] = 'G'; + buf[pos++] = 'e'; + marshalEnable(MVCT_EVENT, buf, sizeof(buf), pos); + + // code - MVE_INSTR_ENABLE_ACTIVITIES + buf[pos++] = 'C'; + buf[pos++] = 'F'; + buf[pos++] = 'G'; + buf[pos++] = 'a'; + marshalEnable(MVCT_ACTIVITY, buf, sizeof(buf), pos); + + return writeAll(mveUds, buf, pos); +} + +void MaliVideoDriver::stop(const int mveUds) { + char buf[8]; + int pos = 0; + + // code - MVE_INSTR_STOP + buf[pos++] = 'S'; + buf[pos++] = 'T'; + buf[pos++] = 'O'; + buf[pos++] = 'P'; + marshalEnable(MVCT_COUNTER, buf, sizeof(buf), pos); + + writeAll(mveUds, buf, pos); + + close(mveUds); +} diff --git a/tools/gator/daemon/MaliVideoDriver.h b/tools/gator/daemon/MaliVideoDriver.h new file mode 100644 index 00000000..204a57a4 --- /dev/null +++ b/tools/gator/daemon/MaliVideoDriver.h @@ -0,0 +1,45 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef MALIVIDEODRIVER_H +#define MALIVIDEODRIVER_H + +#include "Driver.h" + +class MaliVideoCounter; + +enum MaliVideoCounterType { + MVCT_COUNTER, + MVCT_EVENT, + MVCT_ACTIVITY, +}; + +class MaliVideoDriver : public SimpleDriver { +private: + typedef SimpleDriver super; + +public: + MaliVideoDriver(); + ~MaliVideoDriver(); + + void readEvents(mxml_node_t *const root); + + int writeCounters(mxml_node_t *root) const; + + bool start(const int mveUds); + void stop(const int mveUds); + +private: + void marshalEnable(const MaliVideoCounterType type, char *const buf, const size_t bufsize, int &pos); + + // Intentionally unimplemented + MaliVideoDriver(const MaliVideoDriver &); + MaliVideoDriver &operator=(const MaliVideoDriver &); +}; + +#endif // MALIVIDEODRIVER_H diff --git a/tools/gator/daemon/MemInfoDriver.cpp b/tools/gator/daemon/MemInfoDriver.cpp new file mode 100644 index 00000000..cce15c16 --- /dev/null +++ b/tools/gator/daemon/MemInfoDriver.cpp @@ -0,0 +1,93 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "MemInfoDriver.h" + +#include "Logging.h" +#include "SessionData.h" + +class MemInfoCounter : public DriverCounter { +public: + MemInfoCounter(DriverCounter *next, char *const name, int64_t *const value); + ~MemInfoCounter(); + + int64_t read(); + +private: + int64_t *const mValue; + + // Intentionally unimplemented + MemInfoCounter(const MemInfoCounter &); + MemInfoCounter &operator=(const MemInfoCounter &); +}; + +MemInfoCounter::MemInfoCounter(DriverCounter *next, char *const name, int64_t *const value) : DriverCounter(next, name), mValue(value) { +} + +MemInfoCounter::~MemInfoCounter() { +} + +int64_t MemInfoCounter::read() { + return *mValue; +} + +MemInfoDriver::MemInfoDriver() : mBuf(), mMemUsed(0), mMemFree(0), mBuffers(0) { +} + +MemInfoDriver::~MemInfoDriver() { +} + +void MemInfoDriver::readEvents(mxml_node_t *const) { + // Only for use with perf + if (!gSessionData->perf.isSetup()) { + return; + } + + setCounters(new MemInfoCounter(getCounters(), strdup("Linux_meminfo_memused2"), &mMemUsed)); + setCounters(new MemInfoCounter(getCounters(), strdup("Linux_meminfo_memfree"), &mMemFree)); + setCounters(new MemInfoCounter(getCounters(), strdup("Linux_meminfo_bufferram"), &mBuffers)); +} + +void MemInfoDriver::read(Buffer *const buffer) { + if (!countersEnabled()) { + return; + } + + if (!mBuf.read("/proc/meminfo")) { + logg->logError(__FILE__, __LINE__, "Failed to read /proc/meminfo"); + handleException(); + } + + char *key = mBuf.getBuf(); + char *colon; + int64_t memTotal = 0; + while ((colon = strchr(key, ':')) != NULL) { + char *end = strchr(colon + 1, '\n'); + if (end != NULL) { + *end = '\0'; + } + *colon = '\0'; + + if (strcmp(key, "MemTotal") == 0) { + memTotal = strtoll(colon + 1, NULL, 10) << 10; + } else if (strcmp(key, "MemFree") == 0) { + mMemFree = strtoll(colon + 1, NULL, 10) << 10; + } else if (strcmp(key, "Buffers") == 0) { + mBuffers = strtoll(colon + 1, NULL, 10) << 10; + } + + if (end == NULL) { + break; + } + key = end + 1; + } + + mMemUsed = memTotal - mMemFree; + + super::read(buffer); +} diff --git a/tools/gator/daemon/MemInfoDriver.h b/tools/gator/daemon/MemInfoDriver.h new file mode 100644 index 00000000..eb1b0417 --- /dev/null +++ b/tools/gator/daemon/MemInfoDriver.h @@ -0,0 +1,37 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef MEMINFODRIVER_H +#define MEMINFODRIVER_H + +#include "Driver.h" +#include "DynBuf.h" + +class MemInfoDriver : public PolledDriver { +private: + typedef PolledDriver super; + +public: + MemInfoDriver(); + ~MemInfoDriver(); + + void readEvents(mxml_node_t *const root); + void read(Buffer *const buffer); + +private: + DynBuf mBuf; + int64_t mMemUsed; + int64_t mMemFree; + int64_t mBuffers; + + // Intentionally unimplemented + MemInfoDriver(const MemInfoDriver &); + MemInfoDriver &operator=(const MemInfoDriver &); +}; + +#endif // MEMINFODRIVER_H diff --git a/tools/gator/daemon/Monitor.cpp b/tools/gator/daemon/Monitor.cpp new file mode 100644 index 00000000..74f22ee2 --- /dev/null +++ b/tools/gator/daemon/Monitor.cpp @@ -0,0 +1,82 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Monitor.h" + +#include +#include +#include +#include + +#include "Logging.h" + +Monitor::Monitor() : mFd(-1) { +} + +Monitor::~Monitor() { + if (mFd >= 0) { + ::close(mFd); + } +} + +void Monitor::close() { + if (mFd >= 0) { + ::close(mFd); + mFd = -1; + } +} + +bool Monitor::init() { +#ifdef EPOLL_CLOEXEC + mFd = epoll_create1(EPOLL_CLOEXEC); +#else + mFd = epoll_create(16); +#endif + if (mFd < 0) { + logg->logMessage("%s(%s:%i): epoll_create1 failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + +#ifndef EPOLL_CLOEXEC + int fdf = fcntl(mFd, F_GETFD); + if ((fdf == -1) || (fcntl(mFd, F_SETFD, fdf | FD_CLOEXEC) != 0)) { + logg->logMessage("%s(%s:%i): fcntl failed", __FUNCTION__, __FILE__, __LINE__); + ::close(mFd); + return -1; + } +#endif + + return true; +} + +bool Monitor::add(const int fd) { + struct epoll_event event; + memset(&event, 0, sizeof(event)); + event.data.fd = fd; + event.events = EPOLLIN; + if (epoll_ctl(mFd, EPOLL_CTL_ADD, fd, &event) != 0) { + logg->logMessage("%s(%s:%i): epoll_ctl failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + return true; +} + +int Monitor::wait(struct epoll_event *const events, int maxevents, int timeout) { + int result = epoll_wait(mFd, events, maxevents, timeout); + if (result < 0) { + // Ignore if the call was interrupted as this will happen when SIGINT is received + if (errno == EINTR) { + result = 0; + } else { + logg->logMessage("%s(%s:%i): epoll_wait failed", __FUNCTION__, __FILE__, __LINE__); + } + } + + return result; +} diff --git a/tools/gator/daemon/Monitor.h b/tools/gator/daemon/Monitor.h new file mode 100644 index 00000000..7194e0e4 --- /dev/null +++ b/tools/gator/daemon/Monitor.h @@ -0,0 +1,33 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef MONITOR_H +#define MONITOR_H + +#include + +class Monitor { +public: + Monitor(); + ~Monitor(); + + void close(); + bool init(); + bool add(const int fd); + int wait(struct epoll_event *const events, int maxevents, int timeout); + +private: + + int mFd; + + // Intentionally unimplemented + Monitor(const Monitor &); + Monitor &operator=(const Monitor &); +}; + +#endif // MONITOR_H diff --git a/tools/gator/daemon/NetDriver.cpp b/tools/gator/daemon/NetDriver.cpp new file mode 100644 index 00000000..e75c0695 --- /dev/null +++ b/tools/gator/daemon/NetDriver.cpp @@ -0,0 +1,129 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +// Define to get format macros from inttypes.h +#define __STDC_FORMAT_MACROS + +#include "NetDriver.h" + +#include + +#include "Logging.h" +#include "SessionData.h" + +class NetCounter : public DriverCounter { +public: + NetCounter(DriverCounter *next, char *const name, int64_t *const value); + ~NetCounter(); + + int64_t read(); + +private: + int64_t *const mValue; + int64_t mPrev; + + // Intentionally unimplemented + NetCounter(const NetCounter &); + NetCounter &operator=(const NetCounter &); +}; + +NetCounter::NetCounter(DriverCounter *next, char *const name, int64_t *const value) : DriverCounter(next, name), mValue(value), mPrev(0) { +} + +NetCounter::~NetCounter() { +} + +int64_t NetCounter::read() { + int64_t result = *mValue - mPrev; + mPrev = *mValue; + return result; +} + +NetDriver::NetDriver() : mBuf(), mReceiveBytes(0), mTransmitBytes(0) { +} + +NetDriver::~NetDriver() { +} + +void NetDriver::readEvents(mxml_node_t *const) { + // Only for use with perf + if (!gSessionData->perf.isSetup()) { + return; + } + + setCounters(new NetCounter(getCounters(), strdup("Linux_net_rx"), &mReceiveBytes)); + setCounters(new NetCounter(getCounters(), strdup("Linux_net_tx"), &mTransmitBytes)); +} + +bool NetDriver::doRead() { + if (!countersEnabled()) { + return true; + } + + if (!mBuf.read("/proc/net/dev")) { + return false; + } + + // Skip the header + char *key; + if (((key = strchr(mBuf.getBuf(), '\n')) == NULL) || + ((key = strchr(key + 1, '\n')) == NULL)) { + return false; + } + key = key + 1; + + mReceiveBytes = 0; + mTransmitBytes = 0; + + char *colon; + while ((colon = strchr(key, ':')) != NULL) { + char *end = strchr(colon + 1, '\n'); + if (end != NULL) { + *end = '\0'; + } + *colon = '\0'; + + int64_t receiveBytes; + int64_t transmitBytes; + const int count = sscanf(colon + 1, " %" SCNu64 " %*u %*u %*u %*u %*u %*u %*u %" SCNu64, &receiveBytes, &transmitBytes); + if (count != 2) { + return false; + } + mReceiveBytes += receiveBytes; + mTransmitBytes += transmitBytes; + + if (end == NULL) { + break; + } + key = end + 1; + } + + return true; +} + +void NetDriver::start() { + if (!doRead()) { + logg->logError(__FILE__, __LINE__, "Unable to read network stats"); + handleException(); + } + // Initialize previous values + for (DriverCounter *counter = getCounters(); counter != NULL; counter = counter->getNext()) { + if (!counter->isEnabled()) { + continue; + } + counter->read(); + } +} + +void NetDriver::read(Buffer *const buffer) { + if (!doRead()) { + logg->logError(__FILE__, __LINE__, "Unable to read network stats"); + handleException(); + } + super::read(buffer); +} diff --git a/tools/gator/daemon/NetDriver.h b/tools/gator/daemon/NetDriver.h new file mode 100644 index 00000000..50ff850b --- /dev/null +++ b/tools/gator/daemon/NetDriver.h @@ -0,0 +1,39 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef NETDRIVER_H +#define NETDRIVER_H + +#include "Driver.h" +#include "DynBuf.h" + +class NetDriver : public PolledDriver { +private: + typedef PolledDriver super; + +public: + NetDriver(); + ~NetDriver(); + + void readEvents(mxml_node_t *const root); + void start(); + void read(Buffer *const buffer); + +private: + bool doRead(); + + DynBuf mBuf; + int64_t mReceiveBytes; + int64_t mTransmitBytes; + + // Intentionally unimplemented + NetDriver(const NetDriver &); + NetDriver &operator=(const NetDriver &); +}; + +#endif // NETDRIVER_H diff --git a/tools/gator/daemon/OlySocket.cpp b/tools/gator/daemon/OlySocket.cpp new file mode 100644 index 00000000..aa0ce492 --- /dev/null +++ b/tools/gator/daemon/OlySocket.cpp @@ -0,0 +1,324 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "OlySocket.h" + +#include +#include +#ifdef WIN32 +#include +#include +#else +#include +#include +#include +#include +#include +#endif + +#include "Logging.h" + +#ifdef WIN32 +#define CLOSE_SOCKET(x) closesocket(x) +#define SHUTDOWN_RX_TX SD_BOTH +#define snprintf _snprintf +#else +#define CLOSE_SOCKET(x) close(x) +#define SHUTDOWN_RX_TX SHUT_RDWR +#endif + +int socket_cloexec(int domain, int type, int protocol) { +#ifdef SOCK_CLOEXEC + return socket(domain, type | SOCK_CLOEXEC, protocol); +#else + int sock = socket(domain, type, protocol); +#ifdef FD_CLOEXEC + if (sock < 0) { + return -1; + } + int fdf = fcntl(sock, F_GETFD); + if ((fdf == -1) || (fcntl(sock, F_SETFD, fdf | FD_CLOEXEC) != 0)) { + close(sock); + return -1; + } +#endif + return sock; +#endif +} + +int accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { + int sock; +#ifdef SOCK_CLOEXEC + sock = accept4(sockfd, addr, addrlen, SOCK_CLOEXEC); + if (sock >= 0) { + return sock; + } + // accept4 with SOCK_CLOEXEC may not work on all kernels, so fallback +#endif + sock = accept(sockfd, addr, addrlen); +#ifdef FD_CLOEXEC + if (sock < 0) { + return -1; + } + int fdf = fcntl(sock, F_GETFD); + if ((fdf == -1) || (fcntl(sock, F_SETFD, fdf | FD_CLOEXEC) != 0)) { + close(sock); + return -1; + } +#endif + return sock; +} + +OlyServerSocket::OlyServerSocket(int port) { +#ifdef WIN32 + WSADATA wsaData; + if (WSAStartup(0x0202, &wsaData) != 0) { + logg->logError(__FILE__, __LINE__, "Windows socket initialization failed"); + handleException(); + } +#endif + + createServerSocket(port); +} + +OlySocket::OlySocket(int socketID) : mSocketID(socketID) { +} + +#ifndef WIN32 + +#define MIN(A, B) ({ \ + const __typeof__(A) __a = A; \ + const __typeof__(B) __b = B; \ + __a > __b ? __b : __a; \ +}) + +OlyServerSocket::OlyServerSocket(const char* path, const size_t pathSize) { + // Create socket + mFDServer = socket_cloexec(PF_UNIX, SOCK_STREAM, 0); + if (mFDServer < 0) { + logg->logError(__FILE__, __LINE__, "Error creating server socket"); + handleException(); + } + + // Create sockaddr_in structure, ensuring non-populated fields are zero + struct sockaddr_un sockaddr; + memset((void*)&sockaddr, 0, sizeof(sockaddr)); + sockaddr.sun_family = AF_UNIX; + memcpy(sockaddr.sun_path, path, MIN(pathSize, sizeof(sockaddr.sun_path))); + sockaddr.sun_path[sizeof(sockaddr.sun_path) - 1] = '\0'; + + // Bind the socket to an address + if (bind(mFDServer, (const struct sockaddr*)&sockaddr, sizeof(sockaddr)) < 0) { + logg->logError(__FILE__, __LINE__, "Binding of server socket failed."); + handleException(); + } + + // Listen for connections on this socket + if (listen(mFDServer, 1) < 0) { + logg->logError(__FILE__, __LINE__, "Listening of server socket failed"); + handleException(); + } +} + +int OlySocket::connect(const char* path, const size_t pathSize) { + int fd = socket_cloexec(PF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { + return -1; + } + + // Create sockaddr_in structure, ensuring non-populated fields are zero + struct sockaddr_un sockaddr; + memset((void*)&sockaddr, 0, sizeof(sockaddr)); + sockaddr.sun_family = AF_UNIX; + memcpy(sockaddr.sun_path, path, MIN(pathSize, sizeof(sockaddr.sun_path))); + sockaddr.sun_path[sizeof(sockaddr.sun_path) - 1] = '\0'; + + if (::connect(fd, (const struct sockaddr*)&sockaddr, sizeof(sockaddr)) < 0) { + close(fd); + return -1; + } + + return fd; +} + +#endif + +OlySocket::~OlySocket() { + if (mSocketID > 0) { + CLOSE_SOCKET(mSocketID); + } +} + +OlyServerSocket::~OlyServerSocket() { + if (mFDServer > 0) { + CLOSE_SOCKET(mFDServer); + } +} + +void OlySocket::shutdownConnection() { + // Shutdown is primarily used to unblock other threads that are blocking on send/receive functions + shutdown(mSocketID, SHUTDOWN_RX_TX); +} + +void OlySocket::closeSocket() { + // Used for closing an accepted socket but keeping the server socket active + if (mSocketID > 0) { + CLOSE_SOCKET(mSocketID); + mSocketID = -1; + } +} + +void OlyServerSocket::closeServerSocket() { + if (CLOSE_SOCKET(mFDServer) != 0) { + logg->logError(__FILE__, __LINE__, "Failed to close server socket."); + handleException(); + } + mFDServer = 0; +} + +void OlyServerSocket::createServerSocket(int port) { + int family = AF_INET6; + + // Create socket + mFDServer = socket_cloexec(PF_INET6, SOCK_STREAM, IPPROTO_TCP); + if (mFDServer < 0) { + family = AF_INET; + mFDServer = socket_cloexec(PF_INET, SOCK_STREAM, IPPROTO_TCP); + if (mFDServer < 0) { + logg->logError(__FILE__, __LINE__, "Error creating server socket"); + handleException(); + } + } + + // Enable address reuse, another solution would be to create the server socket once and only close it when the object exits + int on = 1; + if (setsockopt(mFDServer, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)) != 0) { + logg->logError(__FILE__, __LINE__, "Setting server socket options failed"); + handleException(); + } + + // Create sockaddr_in structure, ensuring non-populated fields are zero + struct sockaddr_in6 sockaddr; + memset((void*)&sockaddr, 0, sizeof(sockaddr)); + sockaddr.sin6_family = family; + sockaddr.sin6_port = htons(port); + sockaddr.sin6_addr = in6addr_any; + + // Bind the socket to an address + if (bind(mFDServer, (const struct sockaddr*)&sockaddr, sizeof(sockaddr)) < 0) { + logg->logError(__FILE__, __LINE__, "Binding of server socket failed.\nIs an instance already running?"); + handleException(); + } + + // Listen for connections on this socket + if (listen(mFDServer, 1) < 0) { + logg->logError(__FILE__, __LINE__, "Listening of server socket failed"); + handleException(); + } +} + +// mSocketID is always set to the most recently accepted connection +// The user of this class should maintain the different socket connections, e.g. by forking the process +int OlyServerSocket::acceptConnection() { + int socketID; + if (mFDServer <= 0) { + logg->logError(__FILE__, __LINE__, "Attempting multiple connections on a single connection server socket or attempting to accept on a client socket"); + handleException(); + } + + // Accept a connection, note that this call blocks until a client connects + socketID = accept_cloexec(mFDServer, NULL, NULL); + if (socketID < 0) { + logg->logError(__FILE__, __LINE__, "Socket acceptance failed"); + handleException(); + } + return socketID; +} + +void OlySocket::send(const char* buffer, int size) { + if (size <= 0 || buffer == NULL) { + return; + } + + while (size > 0) { + int n = ::send(mSocketID, buffer, size, 0); + if (n < 0) { + logg->logError(__FILE__, __LINE__, "Socket send error"); + handleException(); + } + size -= n; + buffer += n; + } +} + +// Returns the number of bytes received +int OlySocket::receive(char* buffer, int size) { + if (size <= 0 || buffer == NULL) { + return 0; + } + + int bytes = recv(mSocketID, buffer, size, 0); + if (bytes < 0) { + logg->logError(__FILE__, __LINE__, "Socket receive error"); + handleException(); + } else if (bytes == 0) { + logg->logMessage("Socket disconnected"); + return -1; + } + return bytes; +} + +// Receive exactly size bytes of data. Note, this function will block until all bytes are received +int OlySocket::receiveNBytes(char* buffer, int size) { + int bytes = 0; + while (size > 0 && buffer != NULL) { + bytes = recv(mSocketID, buffer, size, 0); + if (bytes < 0) { + logg->logError(__FILE__, __LINE__, "Socket receive error"); + handleException(); + } else if (bytes == 0) { + logg->logMessage("Socket disconnected"); + return -1; + } + buffer += bytes; + size -= bytes; + } + return bytes; +} + +// Receive data until a carriage return, line feed, or null is encountered, or the buffer fills +int OlySocket::receiveString(char* buffer, int size) { + int bytes_received = 0; + bool found = false; + + if (buffer == 0) { + return 0; + } + + while (!found && bytes_received < size) { + // Receive a single character + int bytes = recv(mSocketID, &buffer[bytes_received], 1, 0); + if (bytes < 0) { + logg->logError(__FILE__, __LINE__, "Socket receive error"); + handleException(); + } else if (bytes == 0) { + logg->logMessage("Socket disconnected"); + return -1; + } + + // Replace carriage returns and line feeds with zero + if (buffer[bytes_received] == '\n' || buffer[bytes_received] == '\r' || buffer[bytes_received] == '\0') { + buffer[bytes_received] = '\0'; + found = true; + } + + bytes_received++; + } + + return bytes_received; +} diff --git a/tools/gator/daemon/OlySocket.h b/tools/gator/daemon/OlySocket.h new file mode 100644 index 00000000..6b53b01f --- /dev/null +++ b/tools/gator/daemon/OlySocket.h @@ -0,0 +1,64 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __OLY_SOCKET_H__ +#define __OLY_SOCKET_H__ + +#include + +#ifdef WIN32 +typedef socklen_t int; +#else +#include +#endif + +class OlySocket { +public: +#ifndef WIN32 + static int connect(const char* path, const size_t pathSize); +#endif + + OlySocket(int socketID); + ~OlySocket(); + + void closeSocket(); + void shutdownConnection(); + void send(const char* buffer, int size); + int receive(char* buffer, int size); + int receiveNBytes(char* buffer, int size); + int receiveString(char* buffer, int size); + + bool isValid() const { return mSocketID >= 0; } + +private: + int mSocketID; +}; + +class OlyServerSocket { +public: + OlyServerSocket(int port); +#ifndef WIN32 + OlyServerSocket(const char* path, const size_t pathSize); +#endif + ~OlyServerSocket(); + + int acceptConnection(); + void closeServerSocket(); + + int getFd() { return mFDServer; } + +private: + int mFDServer; + + void createServerSocket(int port); +}; + +int socket_cloexec(int domain, int type, int protocol); +int accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen); + +#endif //__OLY_SOCKET_H__ diff --git a/tools/gator/daemon/OlyUtility.cpp b/tools/gator/daemon/OlyUtility.cpp new file mode 100644 index 00000000..45340a27 --- /dev/null +++ b/tools/gator/daemon/OlyUtility.cpp @@ -0,0 +1,227 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "OlyUtility.h" + +#include +#include +#include +#include + +#if defined(WIN32) +#include +#elif defined(__linux__) +#include +#elif defined(DARWIN) +#include +#endif + +OlyUtility* util = NULL; + +bool OlyUtility::stringToBool(const char* string, bool defValue) { + char value[32]; + + if (string == NULL) { + return defValue; + } + + strncpy(value, string, sizeof(value)); + if (value[0] == 0) { + return defValue; + } + value[sizeof(value) - 1] = 0; // strncpy does not guarantee a null-terminated string + + // Convert to lowercase + int i = 0; + while (value[i]) { + value[i] = tolower(value[i]); + i++; + } + + if (strcmp(value, "true") == 0 || strcmp(value, "yes") == 0 || strcmp(value, "1") == 0 || strcmp(value, "on") == 0) { + return true; + } else if (strcmp(value, "false") == 0 || strcmp(value, "no") == 0 || strcmp(value, "0") == 0 || strcmp(value, "off") == 0) { + return false; + } else { + return defValue; + } +} + +void OlyUtility::stringToLower(char* string) { + if (string == NULL) { + return; + } + + while (*string) { + *string = tolower(*string); + string++; + } +} + +// Modifies fullpath with the path part including the trailing path separator +int OlyUtility::getApplicationFullPath(char* fullpath, int sizeOfPath) { + memset(fullpath, 0, sizeOfPath); +#if defined(WIN32) + int length = GetModuleFileName(NULL, fullpath, sizeOfPath); +#elif defined(__linux__) + int length = readlink("/proc/self/exe", fullpath, sizeOfPath); +#elif defined(DARWIN) + uint32_t length_u = (uint32_t)sizeOfPath; + int length = sizeOfPath; + if (_NSGetExecutablePath(fullpath, &length_u) == 0) { + length = strlen(fullpath); + } +#endif + + if (length == sizeOfPath) { + return -1; + } + + fullpath[length] = 0; + getPathPart(fullpath); + + return 0; +} + +char* OlyUtility::readFromDisk(const char* file, unsigned int *size, bool appendNull) { + // Open the file + FILE* pFile = fopen(file, "rb"); + if (pFile==NULL) { + return NULL; + } + + // Obtain file size + fseek(pFile , 0 , SEEK_END); + unsigned int lSize = ftell(pFile); + rewind(pFile); + + // Allocate memory to contain the whole file + char* buffer = (char*)malloc(lSize + (int)appendNull); + if (buffer == NULL) { + fclose(pFile); + return NULL; + } + + // Copy the file into the buffer + if (fread(buffer, 1, lSize, pFile) != lSize) { + free(buffer); + fclose(pFile); + return NULL; + } + + // Terminate + fclose(pFile); + + if (appendNull) { + buffer[lSize] = 0; + } + + if (size) { + *size = lSize; + } + + return buffer; +} + +int OlyUtility::writeToDisk(const char* path, const char* data) { + // Open the file + FILE* pFile = fopen(path, "wb"); + if (pFile == NULL) { + return -1; + } + + // Write the data to disk + if (fwrite(data, 1, strlen(data), pFile) != strlen(data)) { + fclose(pFile); + return -1; + } + + // Terminate + fclose(pFile); + return 0; +} + +int OlyUtility::appendToDisk(const char* path, const char* data) { + // Open the file + FILE* pFile = fopen(path, "a"); + if (pFile == NULL) { + return -1; + } + + // Write the data to disk + if (fwrite(data, 1, strlen(data), pFile) != strlen(data)) { + fclose(pFile); + return -1; + } + + // Terminate + fclose(pFile); + return 0; +} + +/** + * Copies the srcFile into dstFile in 1kB chunks. + * The dstFile will be overwritten if it exists. + * 0 is returned on an error; otherwise 1. + */ +#define TRANSFER_SIZE 1024 +int OlyUtility::copyFile(const char* srcFile, const char* dstFile) { + char buffer[TRANSFER_SIZE]; + FILE * f_src = fopen(srcFile,"rb"); + if (!f_src) { + return 0; + } + FILE * f_dst = fopen(dstFile,"wb"); + if (!f_dst) { + fclose(f_src); + return 0; + } + while (!feof(f_src)) { + int num_bytes_read = fread(buffer, 1, TRANSFER_SIZE, f_src); + if (num_bytes_read < TRANSFER_SIZE && !feof(f_src)) { + fclose(f_src); + fclose(f_dst); + return 0; + } + int num_bytes_written = fwrite(buffer, 1, num_bytes_read, f_dst); + if (num_bytes_written != num_bytes_read) { + fclose(f_src); + fclose(f_dst); + return 0; + } + } + fclose(f_src); + fclose(f_dst); + return 1; +} + +const char* OlyUtility::getFilePart(const char* path) { + const char* last_sep = strrchr(path, PATH_SEPARATOR); + + // in case path is not a full path + if (last_sep == NULL) { + return path; + } + + return last_sep++; +} + +// getPathPart may modify the contents of path +// returns the path including the trailing path separator +char* OlyUtility::getPathPart(char* path) { + char* last_sep = strrchr(path, PATH_SEPARATOR); + + // in case path is not a full path + if (last_sep == NULL) { + return 0; + } + last_sep++; + *last_sep = 0; + + return (path); +} diff --git a/tools/gator/daemon/OlyUtility.h b/tools/gator/daemon/OlyUtility.h new file mode 100644 index 00000000..1d26beb5 --- /dev/null +++ b/tools/gator/daemon/OlyUtility.h @@ -0,0 +1,42 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef OLY_UTILITY_H +#define OLY_UTILITY_H + +#include + +#ifdef WIN32 +#define PATH_SEPARATOR '\\' +#define CAIMAN_PATH_MAX MAX_PATH +#define snprintf _snprintf +#else +#include +#define PATH_SEPARATOR '/' +#define CAIMAN_PATH_MAX PATH_MAX +#endif + +class OlyUtility { +public: + OlyUtility() {}; + ~OlyUtility() {}; + bool stringToBool(const char* string, bool defValue); + void stringToLower(char* string); + int getApplicationFullPath(char* path, int sizeOfPath); + char* readFromDisk(const char* file, unsigned int *size = NULL, bool appendNull = true); + int writeToDisk(const char* path, const char* file); + int appendToDisk(const char* path, const char* file); + int copyFile(const char* srcFile, const char* dstFile); + const char* getFilePart(const char* path); + char* getPathPart(char* path); +private: +}; + +extern OlyUtility* util; + +#endif // OLY_UTILITY_H diff --git a/tools/gator/daemon/PerfBuffer.cpp b/tools/gator/daemon/PerfBuffer.cpp new file mode 100644 index 00000000..f127c996 --- /dev/null +++ b/tools/gator/daemon/PerfBuffer.cpp @@ -0,0 +1,158 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "PerfBuffer.h" + +#include +#include + +#include "Buffer.h" +#include "Logging.h" +#include "Sender.h" +#include "SessionData.h" + +PerfBuffer::PerfBuffer() { + for (int cpu = 0; cpu < ARRAY_LENGTH(mBuf); ++cpu) { + mBuf[cpu] = MAP_FAILED; + mDiscard[cpu] = false; + mFds[cpu] = -1; + } +} + +PerfBuffer::~PerfBuffer() { + for (int cpu = ARRAY_LENGTH(mBuf) - 1; cpu >= 0; --cpu) { + if (mBuf[cpu] != MAP_FAILED) { + munmap(mBuf[cpu], gSessionData->mPageSize + BUF_SIZE); + } + } +} + +bool PerfBuffer::useFd(const int cpu, const int fd) { + if (mFds[cpu] < 0) { + if (mBuf[cpu] != MAP_FAILED) { + logg->logMessage("%s(%s:%i): cpu %i already online or not correctly cleaned up", __FUNCTION__, __FILE__, __LINE__, cpu); + return false; + } + + // The buffer isn't mapped yet + mBuf[cpu] = mmap(NULL, gSessionData->mPageSize + BUF_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (mBuf[cpu] == MAP_FAILED) { + logg->logMessage("%s(%s:%i): mmap failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + mFds[cpu] = fd; + + // Check the version + struct perf_event_mmap_page *pemp = static_cast(mBuf[cpu]); + if (pemp->compat_version != 0) { + logg->logMessage("%s(%s:%i): Incompatible perf_event_mmap_page compat_version", __FUNCTION__, __FILE__, __LINE__); + return false; + } + } else { + if (mBuf[cpu] == MAP_FAILED) { + logg->logMessage("%s(%s:%i): cpu already online or not correctly cleaned up", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + if (ioctl(fd, PERF_EVENT_IOC_SET_OUTPUT, mFds[cpu]) < 0) { + logg->logMessage("%s(%s:%i): ioctl failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + } + + return true; +} + +void PerfBuffer::discard(const int cpu) { + if (mBuf[cpu] != MAP_FAILED) { + mDiscard[cpu] = true; + } +} + +bool PerfBuffer::isEmpty() { + for (int cpu = 0; cpu < gSessionData->mCores; ++cpu) { + if (mBuf[cpu] != MAP_FAILED) { + // Take a snapshot of the positions + struct perf_event_mmap_page *pemp = static_cast(mBuf[cpu]); + const __u64 head = pemp->data_head; + const __u64 tail = pemp->data_tail; + + if (head != tail) { + return false; + } + } + } + + return true; +} + +static void compressAndSend(const int cpu, const __u64 head, __u64 tail, const uint8_t *const b, Sender *const sender) { + // Pick a big size but something smaller than the chunkSize in Sender::writeData which is 100k + char buf[1<<16]; + int writePos = 0; + const int typeLength = gSessionData->mLocalCapture ? 0 : 1; + + while (head > tail) { + writePos = 0; + if (!gSessionData->mLocalCapture) { + buf[writePos++] = RESPONSE_APC_DATA; + } + // Reserve space for size + writePos += sizeof(uint32_t); + Buffer::packInt(buf, sizeof(buf), writePos, FRAME_PERF); + Buffer::packInt(buf, sizeof(buf), writePos, cpu); + + while (head > tail) { + const int count = reinterpret_cast(b + (tail & BUF_MASK))->size/sizeof(uint64_t); + // Can this whole message be written as Streamline assumes events are not split between frames + if (sizeof(buf) <= writePos + count*Buffer::MAXSIZE_PACK64) { + break; + } + for (int i = 0; i < count; ++i) { + // Must account for message size + Buffer::packInt64(buf, sizeof(buf), writePos, *reinterpret_cast(b + (tail & BUF_MASK))); + tail += sizeof(uint64_t); + } + } + + // Write size + Buffer::writeLEInt(reinterpret_cast(buf + typeLength), writePos - typeLength - sizeof(uint32_t)); + sender->writeData(buf, writePos, RESPONSE_APC_DATA); + } +} + +bool PerfBuffer::send(Sender *const sender) { + for (int cpu = 0; cpu < gSessionData->mCores; ++cpu) { + if (mBuf[cpu] == MAP_FAILED) { + continue; + } + + // Take a snapshot of the positions + struct perf_event_mmap_page *pemp = static_cast(mBuf[cpu]); + const __u64 head = pemp->data_head; + const __u64 tail = pemp->data_tail; + + if (head > tail) { + const uint8_t *const b = static_cast(mBuf[cpu]) + gSessionData->mPageSize; + compressAndSend(cpu, head, tail, b, sender); + + // Update tail with the data read + pemp->data_tail = head; + } + + if (mDiscard[cpu]) { + munmap(mBuf[cpu], gSessionData->mPageSize + BUF_SIZE); + mBuf[cpu] = MAP_FAILED; + mDiscard[cpu] = false; + mFds[cpu] = -1; + logg->logMessage("%s(%s:%i): Unmaped cpu %i", __FUNCTION__, __FILE__, __LINE__, cpu); + } + } + + return true; +} diff --git a/tools/gator/daemon/PerfBuffer.h b/tools/gator/daemon/PerfBuffer.h new file mode 100644 index 00000000..25a10625 --- /dev/null +++ b/tools/gator/daemon/PerfBuffer.h @@ -0,0 +1,41 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef PERF_BUFFER +#define PERF_BUFFER + +#include "Config.h" + +#define BUF_SIZE (gSessionData->mTotalBufferSize * 1024 * 1024) +#define BUF_MASK (BUF_SIZE - 1) + +class Sender; + +class PerfBuffer { +public: + PerfBuffer(); + ~PerfBuffer(); + + bool useFd(const int cpu, const int fd); + void discard(const int cpu); + bool isEmpty(); + bool send(Sender *const sender); + +private: + void *mBuf[NR_CPUS]; + // After the buffer is flushed it should be unmaped + bool mDiscard[NR_CPUS]; + // fd that corresponds to the mBuf + int mFds[NR_CPUS]; + + // Intentionally undefined + PerfBuffer(const PerfBuffer &); + PerfBuffer &operator=(const PerfBuffer &); +}; + +#endif // PERF_BUFFER diff --git a/tools/gator/daemon/PerfDriver.cpp b/tools/gator/daemon/PerfDriver.cpp new file mode 100644 index 00000000..ee90284c --- /dev/null +++ b/tools/gator/daemon/PerfDriver.cpp @@ -0,0 +1,351 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "PerfDriver.h" + +#include +#include +#include +#include + +#include "Buffer.h" +#include "Config.h" +#include "ConfigurationXML.h" +#include "Counter.h" +#include "DriverSource.h" +#include "DynBuf.h" +#include "Logging.h" +#include "PerfGroup.h" +#include "SessionData.h" +#include "Setup.h" + +#define PERF_DEVICES "/sys/bus/event_source/devices" + +#define TYPE_DERIVED ~0U + +// From gator.h +struct gator_cpu { + const int cpuid; + // Human readable name + const char *const core_name; + // gatorfs event and Perf PMU name + const char *const pmnc_name; + const int pmnc_counters; +}; + +// From gator_main.c +static const struct gator_cpu gator_cpus[] = { + { 0xb36, "ARM1136", "ARM_ARM11", 3 }, + { 0xb56, "ARM1156", "ARM_ARM11", 3 }, + { 0xb76, "ARM1176", "ARM_ARM11", 3 }, + { 0xb02, "ARM11MPCore", "ARM_ARM11MPCore", 3 }, + { 0xc05, "Cortex-A5", "ARMv7_Cortex_A5", 2 }, + { 0xc07, "Cortex-A7", "ARMv7_Cortex_A7", 4 }, + { 0xc08, "Cortex-A8", "ARMv7_Cortex_A8", 4 }, + { 0xc09, "Cortex-A9", "ARMv7_Cortex_A9", 6 }, + { 0xc0f, "Cortex-A15", "ARMv7_Cortex_A15", 6 }, + { 0xc0e, "Cortex-A17", "ARMv7_Cortex_A17", 6 }, + { 0x00f, "Scorpion", "Scorpion", 4 }, + { 0x02d, "ScorpionMP", "ScorpionMP", 4 }, + { 0x049, "KraitSIM", "Krait", 4 }, + { 0x04d, "Krait", "Krait", 4 }, + { 0x06f, "Krait S4 Pro", "Krait", 4 }, + { 0xd03, "Cortex-A53", "ARM_Cortex-A53", 6 }, + { 0xd07, "Cortex-A57", "ARM_Cortex-A57", 6 }, + { 0xd0f, "AArch64", "ARM_AArch64", 6 }, +}; + +static const char OLD_PMU_PREFIX[] = "ARMv7 Cortex-"; +static const char NEW_PMU_PREFIX[] = "ARMv7_Cortex_"; + +struct uncore_counter { + // Perf PMU name + const char *const perfName; + // gatorfs event name + const char *const gatorName; + const int count; +}; + +static const struct uncore_counter uncore_counters[] = { + { "CCI_400", "CCI_400", 4 }, + { "CCI_400-r1", "CCI_400-r1", 4 }, + { "ccn", "ARM_CCN_5XX", 8 }, +}; + +class PerfCounter : public DriverCounter { +public: + PerfCounter(DriverCounter *next, const char *name, uint32_t type, uint64_t config, bool perCpu) : DriverCounter(next, name), mType(type), mCount(0), mConfig(config), mPerCpu(perCpu) {} + + ~PerfCounter() { + } + + uint32_t getType() const { return mType; } + int getCount() const { return mCount; } + void setCount(const int count) { mCount = count; } + uint64_t getConfig() const { return mConfig; } + void setConfig(const uint64_t config) { mConfig = config; } + bool isPerCpu() const { return mPerCpu; } + +private: + const uint32_t mType; + int mCount; + uint64_t mConfig; + bool mPerCpu; +}; + +PerfDriver::PerfDriver() : mIsSetup(false), mLegacySupport(false) { +} + +PerfDriver::~PerfDriver() { +} + +void PerfDriver::addCpuCounters(const char *const counterName, const int type, const int numCounters) { + int len = snprintf(NULL, 0, "%s_ccnt", counterName) + 1; + char *name = new char[len]; + snprintf(name, len, "%s_ccnt", counterName); + setCounters(new PerfCounter(getCounters(), name, type, -1, true)); + + for (int j = 0; j < numCounters; ++j) { + len = snprintf(NULL, 0, "%s_cnt%d", counterName, j) + 1; + name = new char[len]; + snprintf(name, len, "%s_cnt%d", counterName, j); + setCounters(new PerfCounter(getCounters(), name, type, -1, true)); + } +} + +void PerfDriver::addUncoreCounters(const char *const counterName, const int type, const int numCounters) { + int len = snprintf(NULL, 0, "%s_ccnt", counterName) + 1; + char *name = new char[len]; + snprintf(name, len, "%s_ccnt", counterName); + setCounters(new PerfCounter(getCounters(), name, type, -1, false)); + + for (int j = 0; j < numCounters; ++j) { + len = snprintf(NULL, 0, "%s_cnt%d", counterName, j) + 1; + name = new char[len]; + snprintf(name, len, "%s_cnt%d", counterName, j); + setCounters(new PerfCounter(getCounters(), name, type, -1, false)); + } +} + +bool PerfDriver::setup() { + // Check the kernel version + int release[3]; + if (!getLinuxVersion(release)) { + logg->logMessage("%s(%s:%i): getLinuxVersion failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + if (KERNEL_VERSION(release[0], release[1], release[2]) < KERNEL_VERSION(3, 4, 0)) { + logg->logMessage("%s(%s:%i): Unsupported kernel version", __FUNCTION__, __FILE__, __LINE__); + return false; + } + mLegacySupport = KERNEL_VERSION(release[0], release[1], release[2]) < KERNEL_VERSION(3, 12, 0); + + if (access(EVENTS_PATH, R_OK) != 0) { + logg->logMessage("%s(%s:%i): " EVENTS_PATH " does not exist, is CONFIG_TRACING and CONFIG_CONTEXT_SWITCH_TRACER enabled?", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + // Add supported PMUs + bool foundCpu = false; + DIR *dir = opendir(PERF_DEVICES); + if (dir == NULL) { + logg->logMessage("%s(%s:%i): opendif failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + struct dirent *dirent; + while ((dirent = readdir(dir)) != NULL) { + for (int i = 0; i < ARRAY_LENGTH(gator_cpus); ++i) { + const struct gator_cpu *const gator_cpu = &gator_cpus[i]; + + // Do the names match exactly? + if (strcasecmp(gator_cpu->pmnc_name, dirent->d_name) != 0 && + // Do these names match but have the old vs new prefix? + ((strncasecmp(dirent->d_name, OLD_PMU_PREFIX, sizeof(OLD_PMU_PREFIX) - 1) != 0 || + strncasecmp(gator_cpu->pmnc_name, NEW_PMU_PREFIX, sizeof(NEW_PMU_PREFIX) - 1) != 0 || + strcasecmp(dirent->d_name + sizeof(OLD_PMU_PREFIX) - 1, gator_cpu->pmnc_name + sizeof(NEW_PMU_PREFIX) - 1) != 0))) { + continue; + } + + int type; + char buf[256]; + snprintf(buf, sizeof(buf), PERF_DEVICES "/%s/type", dirent->d_name); + if (DriverSource::readIntDriver(buf, &type) != 0) { + continue; + } + + foundCpu = true; + logg->logMessage("Adding cpu counters for %s", gator_cpu->pmnc_name); + addCpuCounters(gator_cpu->pmnc_name, type, gator_cpu->pmnc_counters); + } + + for (int i = 0; i < ARRAY_LENGTH(uncore_counters); ++i) { + if (strcmp(dirent->d_name, uncore_counters[i].perfName) != 0) { + continue; + } + + int type; + char buf[256]; + snprintf(buf, sizeof(buf), PERF_DEVICES "/%s/type", dirent->d_name); + if (DriverSource::readIntDriver(buf, &type) != 0) { + continue; + } + + logg->logMessage("Adding uncore counters for %s", uncore_counters[i].gatorName); + addUncoreCounters(uncore_counters[i].gatorName, type, uncore_counters[i].count); + } + } + closedir(dir); + + if (!foundCpu) { + // If no cpu was found based on pmu names, try by cpuid + for (int i = 0; i < ARRAY_LENGTH(gator_cpus); ++i) { + if (gSessionData->mMaxCpuId != gator_cpus[i].cpuid) { + continue; + } + + foundCpu = true; + logg->logMessage("Adding cpu counters (based on cpuid) for %s", gator_cpus[i].pmnc_name); + addCpuCounters(gator_cpus[i].pmnc_name, PERF_TYPE_RAW, gator_cpus[i].pmnc_counters); + } + } + + /* + if (!foundCpu) { + // If all else fails, use the perf architected counters + // 9 because that's how many are in events-Perf-Hardware.xml - assume they can all be enabled at once + addCpuCounters("Perf_Hardware", PERF_TYPE_HARDWARE, 9); + } + */ + + // Add supported software counters + long long id; + DynBuf printb; + + id = getTracepointId("irq/softirq_exit", &printb); + if (id >= 0) { + setCounters(new PerfCounter(getCounters(), "Linux_irq_softirq", PERF_TYPE_TRACEPOINT, id, true)); + } + + id = getTracepointId("irq/irq_handler_exit", &printb); + if (id >= 0) { + setCounters(new PerfCounter(getCounters(), "Linux_irq_irq", PERF_TYPE_TRACEPOINT, id, true)); + } + + id = getTracepointId(SCHED_SWITCH, &printb); + if (id >= 0) { + setCounters(new PerfCounter(getCounters(), "Linux_sched_switch", PERF_TYPE_TRACEPOINT, id, true)); + } + + setCounters(new PerfCounter(getCounters(), "Linux_cpu_wait_contention", TYPE_DERIVED, -1, false)); + + //Linux_cpu_wait_io + + mIsSetup = true; + return true; +} + +bool PerfDriver::summary(Buffer *const buffer) { + struct utsname utsname; + if (uname(&utsname) != 0) { + logg->logMessage("%s(%s:%i): uname failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + char buf[512]; + snprintf(buf, sizeof(buf), "%s %s %s %s %s GNU/Linux", utsname.sysname, utsname.nodename, utsname.release, utsname.version, utsname.machine); + + struct timespec ts; + if (clock_gettime(CLOCK_REALTIME, &ts) != 0) { + logg->logMessage("%s(%s:%i): clock_gettime failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + const int64_t timestamp = (int64_t)ts.tv_sec * NS_PER_S + ts.tv_nsec; + + const uint64_t monotonicStarted = getTime(); + gSessionData->mMonotonicStarted = monotonicStarted; + + buffer->summary(monotonicStarted, timestamp, monotonicStarted, monotonicStarted, buf); + + for (int i = 0; i < gSessionData->mCores; ++i) { + coreName(monotonicStarted, buffer, i); + } + buffer->commit(monotonicStarted); + + return true; +} + +void PerfDriver::coreName(const uint32_t startTime, Buffer *const buffer, const int cpu) { + // Don't send information on a cpu we know nothing about + if (gSessionData->mCpuIds[cpu] == -1) { + return; + } + + int j; + for (j = 0; j < ARRAY_LENGTH(gator_cpus); ++j) { + if (gator_cpus[j].cpuid == gSessionData->mCpuIds[cpu]) { + break; + } + } + if (gator_cpus[j].cpuid == gSessionData->mCpuIds[cpu]) { + buffer->coreName(startTime, cpu, gSessionData->mCpuIds[cpu], gator_cpus[j].core_name); + } else { + char buf[32]; + if (gSessionData->mCpuIds[cpu] == -1) { + snprintf(buf, sizeof(buf), "Unknown"); + } else { + snprintf(buf, sizeof(buf), "Unknown (0x%.3x)", gSessionData->mCpuIds[cpu]); + } + buffer->coreName(startTime, cpu, gSessionData->mCpuIds[cpu], buf); + } +} + +void PerfDriver::setupCounter(Counter &counter) { + PerfCounter *const perfCounter = static_cast(findCounter(counter)); + if (perfCounter == NULL) { + counter.setEnabled(false); + return; + } + + // Don't use the config from counters XML if it's not set, ex: software counters + if (counter.getEvent() != -1) { + perfCounter->setConfig(counter.getEvent()); + } + perfCounter->setCount(counter.getCount()); + perfCounter->setEnabled(true); + counter.setKey(perfCounter->getKey()); +} + +bool PerfDriver::enable(const uint64_t currTime, PerfGroup *const group, Buffer *const buffer) const { + for (PerfCounter *counter = static_cast(getCounters()); counter != NULL; counter = static_cast(counter->getNext())) { + if (counter->isEnabled() && (counter->getType() != TYPE_DERIVED)) { + if (!group->add(currTime, buffer, counter->getKey(), counter->getType(), counter->getConfig(), counter->getCount(), counter->getCount() > 0 ? PERF_SAMPLE_TID | PERF_SAMPLE_IP : 0, counter->isPerCpu() ? PERF_GROUP_PER_CPU : 0)) { + logg->logMessage("%s(%s:%i): PerfGroup::add failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + } + } + + return true; +} + +long long PerfDriver::getTracepointId(const char *const name, DynBuf *const printb) { + if (!printb->printf(EVENTS_PATH "/%s/id", name)) { + logg->logMessage("%s(%s:%i): DynBuf::printf failed", __FUNCTION__, __FILE__, __LINE__); + return -1; + } + + int64_t result; + if (DriverSource::readInt64Driver(printb->getBuf(), &result) != 0) { + logg->logMessage("%s(%s:%i): DriverSource::readInt64Driver failed", __FUNCTION__, __FILE__, __LINE__); + return -1; + } + + return result; +} diff --git a/tools/gator/daemon/PerfDriver.h b/tools/gator/daemon/PerfDriver.h new file mode 100644 index 00000000..846203a9 --- /dev/null +++ b/tools/gator/daemon/PerfDriver.h @@ -0,0 +1,57 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef PERFDRIVER_H +#define PERFDRIVER_H + +#include + +#include "Driver.h" + +// If debugfs is not mounted at /sys/kernel/debug, update DEBUGFS_PATH +#define DEBUGFS_PATH "/sys/kernel/debug" +#define EVENTS_PATH DEBUGFS_PATH "/tracing/events" + +#define SCHED_SWITCH "sched/sched_switch" +#define CPU_IDLE "power/cpu_idle" + +class Buffer; +class DynBuf; +class PerfGroup; + +class PerfDriver : public SimpleDriver { +public: + PerfDriver(); + ~PerfDriver(); + + bool getLegacySupport() const { return mLegacySupport; } + + bool setup(); + bool summary(Buffer *const buffer); + void coreName(const uint32_t startTime, Buffer *const buffer, const int cpu); + bool isSetup() const { return mIsSetup; } + + void setupCounter(Counter &counter); + + bool enable(const uint64_t currTime, PerfGroup *const group, Buffer *const buffer) const; + + static long long getTracepointId(const char *const name, DynBuf *const printb); + +private: + void addCpuCounters(const char *const counterName, const int type, const int numCounters); + void addUncoreCounters(const char *const counterName, const int type, const int numCounters); + + bool mIsSetup; + bool mLegacySupport; + + // Intentionally undefined + PerfDriver(const PerfDriver &); + PerfDriver &operator=(const PerfDriver &); +}; + +#endif // PERFDRIVER_H diff --git a/tools/gator/daemon/PerfGroup.cpp b/tools/gator/daemon/PerfGroup.cpp new file mode 100644 index 00000000..4fd960a9 --- /dev/null +++ b/tools/gator/daemon/PerfGroup.cpp @@ -0,0 +1,244 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "PerfGroup.h" + +#include +#include +#include +#include +#include +#include + +#include "Buffer.h" +#include "Logging.h" +#include "Monitor.h" +#include "PerfBuffer.h" +#include "SessionData.h" + +#define DEFAULT_PEA_ARGS(pea, additionalSampleType) \ + pea.size = sizeof(pea); \ + /* Emit time, read_format below, group leader id, and raw tracepoint info */ \ + pea.sample_type = (gSessionData->perf.getLegacySupport() \ + ? PERF_SAMPLE_TID | PERF_SAMPLE_IP | PERF_SAMPLE_TIME | PERF_SAMPLE_READ | PERF_SAMPLE_ID \ + : PERF_SAMPLE_TIME | PERF_SAMPLE_READ | PERF_SAMPLE_IDENTIFIER ) | additionalSampleType; \ + /* Emit emit value in group format */ \ + pea.read_format = PERF_FORMAT_ID | PERF_FORMAT_GROUP; \ + /* start out disabled */ \ + pea.disabled = 1; \ + /* have a sampling interrupt happen when we cross the wakeup_watermark boundary */ \ + pea.watermark = 1; \ + /* Be conservative in flush size as only one buffer set is monitored */ \ + pea.wakeup_watermark = BUF_SIZE / 2 + +static int sys_perf_event_open(struct perf_event_attr *const attr, const pid_t pid, const int cpu, const int group_fd, const unsigned long flags) { + int fd = syscall(__NR_perf_event_open, attr, pid, cpu, group_fd, flags); + if (fd < 0) { + return -1; + } + int fdf = fcntl(fd, F_GETFD); + if ((fdf == -1) || (fcntl(fd, F_SETFD, fdf | FD_CLOEXEC) != 0)) { + close(fd); + return -1; + } + return fd; +} + +PerfGroup::PerfGroup(PerfBuffer *const pb) : mPb(pb) { + memset(&mAttrs, 0, sizeof(mAttrs)); + memset(&mPerCpu, 0, sizeof(mPerCpu)); + memset(&mKeys, -1, sizeof(mKeys)); + memset(&mFds, -1, sizeof(mFds)); +} + +PerfGroup::~PerfGroup() { + for (int pos = ARRAY_LENGTH(mFds) - 1; pos >= 0; --pos) { + if (mFds[pos] >= 0) { + close(mFds[pos]); + } + } +} + +bool PerfGroup::add(const uint64_t currTime, Buffer *const buffer, const int key, const __u32 type, const __u64 config, const __u64 sample, const __u64 sampleType, const int flags) { + int i; + for (i = 0; i < ARRAY_LENGTH(mKeys); ++i) { + if (mKeys[i] < 0) { + break; + } + } + + if (i >= ARRAY_LENGTH(mKeys)) { + logg->logMessage("%s(%s:%i): Too many counters", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + DEFAULT_PEA_ARGS(mAttrs[i], sampleType); + mAttrs[i].type = type; + mAttrs[i].config = config; + mAttrs[i].sample_period = sample; + // always be on the CPU but only a group leader can be pinned + mAttrs[i].pinned = (i == 0 ? 1 : 0); + mAttrs[i].mmap = (flags & PERF_GROUP_MMAP ? 1 : 0); + mAttrs[i].comm = (flags & PERF_GROUP_COMM ? 1 : 0); + mAttrs[i].freq = (flags & PERF_GROUP_FREQ ? 1 : 0); + mAttrs[i].task = (flags & PERF_GROUP_TASK ? 1 : 0); + mAttrs[i].sample_id_all = (flags & PERF_GROUP_SAMPLE_ID_ALL ? 1 : 0); + mPerCpu[i] = (flags & PERF_GROUP_PER_CPU); + + mKeys[i] = key; + + buffer->pea(currTime, &mAttrs[i], key); + + return true; +} + +int PerfGroup::prepareCPU(const int cpu, Monitor *const monitor) { + logg->logMessage("%s(%s:%i): Onlining cpu %i", __FUNCTION__, __FILE__, __LINE__, cpu); + + for (int i = 0; i < ARRAY_LENGTH(mKeys); ++i) { + if (mKeys[i] < 0) { + continue; + } + + if ((cpu != 0) && !mPerCpu[i]) { + continue; + } + + const int offset = i * gSessionData->mCores; + if (mFds[cpu + offset] >= 0) { + logg->logMessage("%s(%s:%i): cpu already online or not correctly cleaned up", __FUNCTION__, __FILE__, __LINE__); + return PG_FAILURE; + } + + logg->logMessage("%s(%s:%i): perf_event_open cpu: %i type: %lli config: %lli sample: %lli sample_type: 0x%llx pinned: %i mmap: %i comm: %i freq: %i task: %i sample_id_all: %i", __FUNCTION__, __FILE__, __LINE__, cpu, (long long)mAttrs[i].type, (long long)mAttrs[i].config, (long long)mAttrs[i].sample_period, (long long)mAttrs[i].sample_type, mAttrs[i].pinned, mAttrs[i].mmap, mAttrs[i].comm, mAttrs[i].freq, mAttrs[i].task, mAttrs[i].sample_id_all); + mFds[cpu + offset] = sys_perf_event_open(&mAttrs[i], -1, cpu, i == 0 ? -1 : mFds[cpu], i == 0 ? 0 : PERF_FLAG_FD_OUTPUT); + if (mFds[cpu + offset] < 0) { + logg->logMessage("%s(%s:%i): failed %s", __FUNCTION__, __FILE__, __LINE__, strerror(errno)); + if (errno == ENODEV) { + return PG_CPU_OFFLINE; + } + continue; + } + + if (!mPb->useFd(cpu, mFds[cpu + offset])) { + logg->logMessage("%s(%s:%i): PerfBuffer::useFd failed", __FUNCTION__, __FILE__, __LINE__); + return PG_FAILURE; + } + + + if (!monitor->add(mFds[cpu + offset])) { + logg->logMessage("%s(%s:%i): Monitor::add failed", __FUNCTION__, __FILE__, __LINE__); + return PG_FAILURE; + } + } + + return PG_SUCCESS; +} + +int PerfGroup::onlineCPU(const uint64_t currTime, const int cpu, const bool start, Buffer *const buffer) { + __u64 ids[ARRAY_LENGTH(mKeys)]; + int coreKeys[ARRAY_LENGTH(mKeys)]; + int idCount = 0; + + for (int i = 0; i < ARRAY_LENGTH(mKeys); ++i) { + const int fd = mFds[cpu + i * gSessionData->mCores]; + if (fd < 0) { + continue; + } + + coreKeys[idCount] = mKeys[i]; + if (!gSessionData->perf.getLegacySupport() && ioctl(fd, PERF_EVENT_IOC_ID, &ids[idCount]) != 0 && + // Workaround for running 32-bit gatord on 64-bit systems, kernel patch in the works + ioctl(fd, (PERF_EVENT_IOC_ID & ~IOCSIZE_MASK) | (8 << _IOC_SIZESHIFT), &ids[idCount]) != 0) { + logg->logMessage("%s(%s:%i): ioctl failed", __FUNCTION__, __FILE__, __LINE__); + return 0; + } + ++idCount; + } + + if (!gSessionData->perf.getLegacySupport()) { + buffer->keys(currTime, idCount, ids, coreKeys); + } else { + char buf[1024]; + ssize_t bytes = read(mFds[cpu], buf, sizeof(buf)); + if (bytes < 0) { + logg->logMessage("read failed"); + return 0; + } + buffer->keysOld(currTime, idCount, coreKeys, bytes, buf); + } + + if (start) { + for (int i = 0; i < ARRAY_LENGTH(mKeys); ++i) { + int offset = i * gSessionData->mCores + cpu; + if (mFds[offset] >= 0 && ioctl(mFds[offset], PERF_EVENT_IOC_ENABLE, 0) < 0) { + logg->logMessage("%s(%s:%i): ioctl failed", __FUNCTION__, __FILE__, __LINE__); + return 0; + } + } + } + + if (idCount == 0) { + logg->logMessage("%s(%s:%i): no events came online", __FUNCTION__, __FILE__, __LINE__); + } + + return idCount; +} + +bool PerfGroup::offlineCPU(const int cpu) { + logg->logMessage("%s(%s:%i): Offlining cpu %i", __FUNCTION__, __FILE__, __LINE__, cpu); + + for (int i = 0; i < ARRAY_LENGTH(mKeys); ++i) { + int offset = i * gSessionData->mCores + cpu; + if (mFds[offset] >= 0 && ioctl(mFds[offset], PERF_EVENT_IOC_DISABLE, 0) < 0) { + logg->logMessage("%s(%s:%i): ioctl failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + } + + // Mark the buffer so that it will be released next time it's read + mPb->discard(cpu); + + for (int i = 0; i < ARRAY_LENGTH(mKeys); ++i) { + if (mKeys[i] < 0) { + continue; + } + + int offset = i * gSessionData->mCores + cpu; + if (mFds[offset] >= 0) { + close(mFds[offset]); + mFds[offset] = -1; + } + } + + return true; +} + +bool PerfGroup::start() { + for (int pos = 0; pos < ARRAY_LENGTH(mFds); ++pos) { + if (mFds[pos] >= 0 && ioctl(mFds[pos], PERF_EVENT_IOC_ENABLE, 0) < 0) { + logg->logMessage("%s(%s:%i): ioctl failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } + } + + return true; + + fail: + stop(); + + return false; +} + +void PerfGroup::stop() { + for (int pos = ARRAY_LENGTH(mFds) - 1; pos >= 0; --pos) { + if (mFds[pos] >= 0) { + ioctl(mFds[pos], PERF_EVENT_IOC_DISABLE, 0); + } + } +} diff --git a/tools/gator/daemon/PerfGroup.h b/tools/gator/daemon/PerfGroup.h new file mode 100644 index 00000000..f7b3d725 --- /dev/null +++ b/tools/gator/daemon/PerfGroup.h @@ -0,0 +1,65 @@ + /** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef PERF_GROUP +#define PERF_GROUP + +#include + +// Use a snapshot of perf_event.h as it may be more recent than what is on the target and if not newer features won't be supported anyways +#include "k/perf_event.h" + +#include "Config.h" + +class Buffer; +class Monitor; +class PerfBuffer; + +enum PerfGroupFlags { + PERF_GROUP_MMAP = 1 << 0, + PERF_GROUP_COMM = 1 << 1, + PERF_GROUP_FREQ = 1 << 2, + PERF_GROUP_TASK = 1 << 3, + PERF_GROUP_SAMPLE_ID_ALL = 1 << 4, + PERF_GROUP_PER_CPU = 1 << 5, +}; + +enum { + PG_SUCCESS = 0, + PG_FAILURE, + PG_CPU_OFFLINE, +}; + +class PerfGroup { +public: + PerfGroup(PerfBuffer *const pb); + ~PerfGroup(); + + bool add(const uint64_t currTime, Buffer *const buffer, const int key, const __u32 type, const __u64 config, const __u64 sample, const __u64 sampleType, const int flags); + // Safe to call concurrently + int prepareCPU(const int cpu, Monitor *const monitor); + // Not safe to call concurrently. Returns the number of events enabled + int onlineCPU(const uint64_t currTime, const int cpu, const bool start, Buffer *const buffer); + bool offlineCPU(int cpu); + bool start(); + void stop(); + +private: + // +1 for the group leader + struct perf_event_attr mAttrs[MAX_PERFORMANCE_COUNTERS + 1]; + bool mPerCpu[MAX_PERFORMANCE_COUNTERS + 1]; + int mKeys[MAX_PERFORMANCE_COUNTERS + 1]; + int mFds[NR_CPUS * (MAX_PERFORMANCE_COUNTERS + 1)]; + PerfBuffer *const mPb; + + // Intentionally undefined + PerfGroup(const PerfGroup &); + PerfGroup &operator=(const PerfGroup &); +}; + +#endif // PERF_GROUP diff --git a/tools/gator/daemon/PerfSource.cpp b/tools/gator/daemon/PerfSource.cpp new file mode 100644 index 00000000..193b7789 --- /dev/null +++ b/tools/gator/daemon/PerfSource.cpp @@ -0,0 +1,449 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "PerfSource.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Child.h" +#include "DynBuf.h" +#include "Logging.h" +#include "PerfDriver.h" +#include "Proc.h" +#include "SessionData.h" + +#ifndef SCHED_RESET_ON_FORK +#define SCHED_RESET_ON_FORK 0x40000000 +#endif + +extern Child *child; + +static bool sendTracepointFormat(const uint64_t currTime, Buffer *const buffer, const char *const name, DynBuf *const printb, DynBuf *const b) { + if (!printb->printf(EVENTS_PATH "/%s/format", name)) { + logg->logMessage("%s(%s:%i): DynBuf::printf failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + if (!b->read(printb->getBuf())) { + logg->logMessage("%s(%s:%i): DynBuf::read failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + buffer->format(currTime, b->getLength(), b->getBuf()); + + return true; +} + +static void *syncFunc(void *arg) +{ + struct timespec ts; + int64_t nextTime = gSessionData->mMonotonicStarted; + int err; + (void)arg; + + prctl(PR_SET_NAME, (unsigned long)&"gatord-sync", 0, 0, 0); + + // Mask all signals so that this thread will not be woken up + { + sigset_t set; + if (sigfillset(&set) != 0) { + logg->logError(__FILE__, __LINE__, "sigfillset failed"); + handleException(); + } + if ((err = pthread_sigmask(SIG_SETMASK, &set, NULL)) != 0) { + logg->logError(__FILE__, __LINE__, "pthread_sigmask failed"); + handleException(); + } + } + + for (;;) { + if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts) != 0) { + logg->logError(__FILE__, __LINE__, "clock_gettime failed"); + handleException(); + } + const int64_t currTime = ts.tv_sec * NS_PER_S + ts.tv_nsec; + + // Wake up once a second + nextTime += NS_PER_S; + + // Always sleep more than 1 ms, hopefully things will line up better next time + const int64_t sleepTime = max(nextTime - currTime, (int64_t)(NS_PER_MS + 1)); + ts.tv_sec = sleepTime/NS_PER_S; + ts.tv_nsec = sleepTime % NS_PER_S; + + err = nanosleep(&ts, NULL); + if (err != 0) { + fprintf(stderr, "clock_nanosleep failed: %s\n", strerror(err)); + return NULL; + } + } + + return NULL; +} + +static long getMaxCoreNum() { + DIR *dir = opendir("/sys/devices/system/cpu"); + if (dir == NULL) { + logg->logError(__FILE__, __LINE__, "Unable to determine the number of cores on the target, opendir failed"); + handleException(); + } + + long maxCoreNum = -1; + struct dirent *dirent; + while ((dirent = readdir(dir)) != NULL) { + if (strncmp(dirent->d_name, "cpu", 3) == 0) { + char *endptr; + errno = 0; + long coreNum = strtol(dirent->d_name + 3, &endptr, 10); + if ((errno == 0) && (*endptr == '\0') && (coreNum >= maxCoreNum)) { + maxCoreNum = coreNum + 1; + } + } + } + closedir(dir); + + if (maxCoreNum < 1) { + logg->logError(__FILE__, __LINE__, "Unable to determine the number of cores on the target, no cpu# directories found"); + handleException(); + } + + if (maxCoreNum >= NR_CPUS) { + logg->logError(__FILE__, __LINE__, "Too many cores on the target, please increase NR_CPUS in Config.h"); + handleException(); + } + + return maxCoreNum; +} + +PerfSource::PerfSource(sem_t *senderSem, sem_t *startProfile) : mSummary(0, FRAME_SUMMARY, 1024, senderSem), mBuffer(0, FRAME_PERF_ATTRS, 1024*1024, senderSem), mCountersBuf(), mCountersGroup(&mCountersBuf), mIdleGroup(&mCountersBuf), mMonitor(), mUEvent(), mSenderSem(senderSem), mStartProfile(startProfile), mInterruptFd(-1), mIsDone(false) { + long l = sysconf(_SC_PAGE_SIZE); + if (l < 0) { + logg->logError(__FILE__, __LINE__, "Unable to obtain the page size"); + handleException(); + } + gSessionData->mPageSize = static_cast(l); + gSessionData->mCores = static_cast(getMaxCoreNum()); +} + +PerfSource::~PerfSource() { +} + +bool PerfSource::prepare() { + DynBuf printb; + DynBuf b1; + long long schedSwitchId; + long long cpuIdleId; + + const uint64_t currTime = getTime(); + + // Reread cpuinfo since cores may have changed since startup + gSessionData->readCpuInfo(); + + if (0 + || !mMonitor.init() + || !mUEvent.init() + || !mMonitor.add(mUEvent.getFd()) + + || (schedSwitchId = PerfDriver::getTracepointId(SCHED_SWITCH, &printb)) < 0 + || !sendTracepointFormat(currTime, &mBuffer, SCHED_SWITCH, &printb, &b1) + + || (cpuIdleId = PerfDriver::getTracepointId(CPU_IDLE, &printb)) < 0 + || !sendTracepointFormat(currTime, &mBuffer, CPU_IDLE, &printb, &b1) + + // Only want RAW but not IP on sched_switch and don't want TID on SAMPLE_ID + || !mCountersGroup.add(currTime, &mBuffer, 100/**/, PERF_TYPE_TRACEPOINT, schedSwitchId, 1, PERF_SAMPLE_RAW, PERF_GROUP_MMAP | PERF_GROUP_COMM | PERF_GROUP_TASK | PERF_GROUP_SAMPLE_ID_ALL | PERF_GROUP_PER_CPU) + || !mIdleGroup.add(currTime, &mBuffer, 101/**/, PERF_TYPE_TRACEPOINT, cpuIdleId, 1, PERF_SAMPLE_RAW, PERF_GROUP_PER_CPU) + + // Only want TID and IP but not RAW on timer + || (gSessionData->mSampleRate > 0 && !gSessionData->mIsEBS && !mCountersGroup.add(currTime, &mBuffer, 102/**/, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK, 1000000000UL / gSessionData->mSampleRate, PERF_SAMPLE_TID | PERF_SAMPLE_IP, PERF_GROUP_PER_CPU)) + + || !gSessionData->perf.enable(currTime, &mCountersGroup, &mBuffer) + || 0) { + logg->logMessage("%s(%s:%i): perf setup failed, are you running Linux 3.4 or later?", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + for (int cpu = 0; cpu < gSessionData->mCores; ++cpu) { + const int result = mCountersGroup.prepareCPU(cpu, &mMonitor); + if ((result != PG_SUCCESS) && (result != PG_CPU_OFFLINE)) { + logg->logError(__FILE__, __LINE__, "PerfGroup::prepareCPU on mCountersGroup failed"); + handleException(); + } + } + for (int cpu = 0; cpu < gSessionData->mCores; ++cpu) { + const int result = mIdleGroup.prepareCPU(cpu, &mMonitor); + if ((result != PG_SUCCESS) && (result != PG_CPU_OFFLINE)) { + logg->logError(__FILE__, __LINE__, "PerfGroup::prepareCPU on mIdleGroup failed"); + handleException(); + } + } + + int numEvents = 0; + for (int cpu = 0; cpu < gSessionData->mCores; ++cpu) { + numEvents += mCountersGroup.onlineCPU(currTime, cpu, false, &mBuffer); + } + for (int cpu = 0; cpu < gSessionData->mCores; ++cpu) { + numEvents += mIdleGroup.onlineCPU(currTime, cpu, false, &mBuffer); + } + if (numEvents <= 0) { + logg->logMessage("%s(%s:%i): PerfGroup::onlineCPU failed on all cores", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + // Send the summary right before the start so that the monotonic delta is close to the start time + if (!gSessionData->perf.summary(&mSummary)) { + logg->logError(__FILE__, __LINE__, "PerfDriver::summary failed", __FUNCTION__, __FILE__, __LINE__); + handleException(); + } + + // Start the timer thread to used to sync perf and monotonic raw times + pthread_t syncThread; + if (pthread_create(&syncThread, NULL, syncFunc, NULL)) { + logg->logError(__FILE__, __LINE__, "pthread_create failed", __FUNCTION__, __FILE__, __LINE__); + handleException(); + } + struct sched_param param; + param.sched_priority = sched_get_priority_max(SCHED_FIFO); + if (pthread_setschedparam(syncThread, SCHED_FIFO | SCHED_RESET_ON_FORK, ¶m) != 0) { + logg->logError(__FILE__, __LINE__, "pthread_setschedparam failed"); + handleException(); + } + + mBuffer.commit(currTime); + + return true; +} + +struct ProcThreadArgs { + Buffer *mBuffer; + uint64_t mCurrTime; + bool mIsDone; +}; + +void *procFunc(void *arg) { + DynBuf printb; + DynBuf b; + const ProcThreadArgs *const args = (ProcThreadArgs *)arg; + + prctl(PR_SET_NAME, (unsigned long)&"gatord-proc", 0, 0, 0); + + // Gator runs at a high priority, reset the priority to the default + if (setpriority(PRIO_PROCESS, syscall(__NR_gettid), 0) == -1) { + logg->logError(__FILE__, __LINE__, "setpriority failed"); + handleException(); + } + + if (!readProcMaps(args->mCurrTime, args->mBuffer, &printb, &b)) { + logg->logError(__FILE__, __LINE__, "readProcMaps failed"); + handleException(); + } + args->mBuffer->commit(args->mCurrTime); + + if (!readKallsyms(args->mCurrTime, args->mBuffer, &args->mIsDone)) { + logg->logError(__FILE__, __LINE__, "readKallsyms failed"); + handleException(); + } + args->mBuffer->commit(args->mCurrTime); + + return NULL; +} + +static const char CPU_DEVPATH[] = "/devices/system/cpu/cpu"; + +void PerfSource::run() { + int pipefd[2]; + pthread_t procThread; + ProcThreadArgs procThreadArgs; + + { + DynBuf printb; + DynBuf b1; + DynBuf b2; + + const uint64_t currTime = getTime(); + + // Start events before reading proc to avoid race conditions + if (!mCountersGroup.start() || !mIdleGroup.start()) { + logg->logError(__FILE__, __LINE__, "PerfGroup::start failed", __FUNCTION__, __FILE__, __LINE__); + handleException(); + } + + if (!readProcComms(currTime, &mBuffer, &printb, &b1, &b2)) { + logg->logError(__FILE__, __LINE__, "readProcComms failed"); + handleException(); + } + mBuffer.commit(currTime); + + // Postpone reading kallsyms as on android adb gets too backed up and data is lost + procThreadArgs.mBuffer = &mBuffer; + procThreadArgs.mCurrTime = currTime; + procThreadArgs.mIsDone = false; + if (pthread_create(&procThread, NULL, procFunc, &procThreadArgs)) { + logg->logError(__FILE__, __LINE__, "pthread_create failed", __FUNCTION__, __FILE__, __LINE__); + handleException(); + } + } + + if (pipe_cloexec(pipefd) != 0) { + logg->logError(__FILE__, __LINE__, "pipe failed"); + handleException(); + } + mInterruptFd = pipefd[1]; + + if (!mMonitor.add(pipefd[0])) { + logg->logError(__FILE__, __LINE__, "Monitor::add failed"); + handleException(); + } + + int timeout = -1; + if (gSessionData->mLiveRate > 0) { + timeout = gSessionData->mLiveRate/NS_PER_MS; + } + + sem_post(mStartProfile); + + while (gSessionData->mSessionIsActive) { + // +1 for uevents, +1 for pipe + struct epoll_event events[NR_CPUS + 2]; + int ready = mMonitor.wait(events, ARRAY_LENGTH(events), timeout); + if (ready < 0) { + logg->logError(__FILE__, __LINE__, "Monitor::wait failed"); + handleException(); + } + const uint64_t currTime = getTime(); + + for (int i = 0; i < ready; ++i) { + if (events[i].data.fd == mUEvent.getFd()) { + if (!handleUEvent(currTime)) { + logg->logError(__FILE__, __LINE__, "PerfSource::handleUEvent failed"); + handleException(); + } + break; + } + } + + // send a notification that data is ready + sem_post(mSenderSem); + + // In one shot mode, stop collection once all the buffers are filled + // Assume timeout == 0 in this case + if (gSessionData->mOneShot && gSessionData->mSessionIsActive) { + logg->logMessage("%s(%s:%i): One shot", __FUNCTION__, __FILE__, __LINE__); + child->endSession(); + } + } + + procThreadArgs.mIsDone = true; + pthread_join(procThread, NULL); + mIdleGroup.stop(); + mCountersGroup.stop(); + mBuffer.setDone(); + mIsDone = true; + + // send a notification that data is ready + sem_post(mSenderSem); + + mInterruptFd = -1; + close(pipefd[0]); + close(pipefd[1]); +} + +bool PerfSource::handleUEvent(const uint64_t currTime) { + UEventResult result; + if (!mUEvent.read(&result)) { + logg->logMessage("%s(%s:%i): UEvent::Read failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + if (strcmp(result.mSubsystem, "cpu") == 0) { + if (strncmp(result.mDevPath, CPU_DEVPATH, sizeof(CPU_DEVPATH) - 1) != 0) { + logg->logMessage("%s(%s:%i): Unexpected cpu DEVPATH format", __FUNCTION__, __FILE__, __LINE__); + return false; + } + char *endptr; + errno = 0; + int cpu = strtol(result.mDevPath + sizeof(CPU_DEVPATH) - 1, &endptr, 10); + if (errno != 0 || *endptr != '\0') { + logg->logMessage("%s(%s:%i): strtol failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + if (cpu >= gSessionData->mCores) { + logg->logError(__FILE__, __LINE__, "Only %i cores are expected but core %i reports %s", gSessionData->mCores, cpu, result.mAction); + handleException(); + } + + if (strcmp(result.mAction, "online") == 0) { + mBuffer.onlineCPU(currTime, currTime - gSessionData->mMonotonicStarted, cpu); + // Only call onlineCPU if prepareCPU succeeded + bool result = false; + int err = mCountersGroup.prepareCPU(cpu, &mMonitor); + if (err == PG_CPU_OFFLINE) { + result = true; + } else if (err == PG_SUCCESS) { + if (mCountersGroup.onlineCPU(currTime, cpu, true, &mBuffer)) { + err = mIdleGroup.prepareCPU(cpu, &mMonitor); + if (err == PG_CPU_OFFLINE) { + result = true; + } else if (err == PG_SUCCESS) { + if (mIdleGroup.onlineCPU(currTime, cpu, true, &mBuffer)) { + result = true; + } + } + } + } + mBuffer.commit(currTime); + + gSessionData->readCpuInfo(); + gSessionData->perf.coreName(currTime, &mSummary, cpu); + mSummary.commit(currTime); + return result; + } else if (strcmp(result.mAction, "offline") == 0) { + const bool result = mCountersGroup.offlineCPU(cpu) && mIdleGroup.offlineCPU(cpu); + mBuffer.offlineCPU(currTime, currTime - gSessionData->mMonotonicStarted, cpu); + return result; + } + } + + return true; +} + +void PerfSource::interrupt() { + if (mInterruptFd >= 0) { + int8_t c = 0; + // Write to the pipe to wake the monitor which will cause mSessionIsActive to be reread + if (::write(mInterruptFd, &c, sizeof(c)) != sizeof(c)) { + logg->logError(__FILE__, __LINE__, "write failed"); + handleException(); + } + } +} + +bool PerfSource::isDone () { + return mBuffer.isDone() && mIsDone && mCountersBuf.isEmpty(); +} + +void PerfSource::write (Sender *sender) { + if (!mSummary.isDone()) { + mSummary.write(sender); + gSessionData->mSentSummary = true; + } + if (!mBuffer.isDone()) { + mBuffer.write(sender); + } + if (!mCountersBuf.send(sender)) { + logg->logError(__FILE__, __LINE__, "PerfBuffer::send failed"); + handleException(); + } +} diff --git a/tools/gator/daemon/PerfSource.h b/tools/gator/daemon/PerfSource.h new file mode 100644 index 00000000..ce1eafe8 --- /dev/null +++ b/tools/gator/daemon/PerfSource.h @@ -0,0 +1,55 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef PERFSOURCE_H +#define PERFSOURCE_H + +#include + +#include "Buffer.h" +#include "Monitor.h" +#include "PerfBuffer.h" +#include "PerfGroup.h" +#include "Source.h" +#include "UEvent.h" + +class Sender; + +class PerfSource : public Source { +public: + PerfSource(sem_t *senderSem, sem_t *startProfile); + ~PerfSource(); + + bool prepare(); + void run(); + void interrupt(); + + bool isDone(); + void write(Sender *sender); + +private: + bool handleUEvent(const uint64_t currTime); + + Buffer mSummary; + Buffer mBuffer; + PerfBuffer mCountersBuf; + PerfGroup mCountersGroup; + PerfGroup mIdleGroup; + Monitor mMonitor; + UEvent mUEvent; + sem_t *const mSenderSem; + sem_t *const mStartProfile; + int mInterruptFd; + bool mIsDone; + + // Intentionally undefined + PerfSource(const PerfSource &); + PerfSource &operator=(const PerfSource &); +}; + +#endif // PERFSOURCE_H diff --git a/tools/gator/daemon/Proc.cpp b/tools/gator/daemon/Proc.cpp new file mode 100644 index 00000000..e6b26b11 --- /dev/null +++ b/tools/gator/daemon/Proc.cpp @@ -0,0 +1,312 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Proc.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "Buffer.h" +#include "DynBuf.h" +#include "Logging.h" +#include "SessionData.h" + +struct ProcStat { + // From linux-dev/include/linux/sched.h +#define TASK_COMM_LEN 16 + // TASK_COMM_LEN may grow, so be ready for it to get larger + char comm[2*TASK_COMM_LEN]; + long numThreads; +}; + +static bool readProcStat(ProcStat *const ps, const char *const pathname, DynBuf *const b) { + if (!b->read(pathname)) { + logg->logMessage("%s(%s:%i): DynBuf::read failed, likely because the thread exited", __FUNCTION__, __FILE__, __LINE__); + // This is not a fatal error - the thread just doesn't exist any more + return true; + } + + char *comm = strchr(b->getBuf(), '('); + if (comm == NULL) { + logg->logMessage("%s(%s:%i): parsing stat failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + ++comm; + char *const str = strrchr(comm, ')'); + if (str == NULL) { + logg->logMessage("%s(%s:%i): parsing stat failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + *str = '\0'; + strncpy(ps->comm, comm, sizeof(ps->comm) - 1); + ps->comm[sizeof(ps->comm) - 1] = '\0'; + + const int count = sscanf(str + 2, " %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %ld", &ps->numThreads); + if (count != 1) { + logg->logMessage("%s(%s:%i): sscanf failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + return true; +} + +static const char APP_PROCESS[] = "app_process"; + +static const char *readProcExe(DynBuf *const printb, const int pid, const int tid, DynBuf *const b) { + if (tid == -1 ? !printb->printf("/proc/%i/exe", pid) + : !printb->printf("/proc/%i/task/%i/exe", pid, tid)) { + logg->logMessage("%s(%s:%i): DynBuf::printf failed", __FUNCTION__, __FILE__, __LINE__); + return NULL; + } + + const int err = b->readlink(printb->getBuf()); + const char *image; + if (err == 0) { + image = strrchr(b->getBuf(), '/'); + if (image == NULL) { + image = b->getBuf(); + } else { + ++image; + } + } else if (err == -ENOENT) { + // readlink /proc/[pid]/exe returns ENOENT for kernel threads + image = "\0"; + } else { + logg->logMessage("%s(%s:%i): DynBuf::readlink failed", __FUNCTION__, __FILE__, __LINE__); + return NULL; + } + + // Android apps are run by app_process but the cmdline is changed to reference the actual app name + // On 64-bit android app_process can be app_process32 or app_process64 + if (strncmp(image, APP_PROCESS, sizeof(APP_PROCESS) - 1) != 0) { + return image; + } + + if (tid == -1 ? !printb->printf("/proc/%i/cmdline", pid) + : !printb->printf("/proc/%i/task/%i/cmdline", pid, tid)) { + logg->logMessage("%s(%s:%i): DynBuf::printf failed", __FUNCTION__, __FILE__, __LINE__); + return NULL; + } + + if (!b->read(printb->getBuf())) { + logg->logMessage("%s(%s:%i): DynBuf::read failed, likely because the thread exited", __FUNCTION__, __FILE__, __LINE__); + return NULL; + } + + return b->getBuf(); +} + +static bool readProcTask(const uint64_t currTime, Buffer *const buffer, const int pid, DynBuf *const printb, DynBuf *const b1, DynBuf *const b2) { + bool result = false; + + if (!b1->printf("/proc/%i/task", pid)) { + logg->logMessage("%s(%s:%i): DynBuf::printf failed", __FUNCTION__, __FILE__, __LINE__); + return result; + } + DIR *task = opendir(b1->getBuf()); + if (task == NULL) { + logg->logMessage("%s(%s:%i): opendir failed", __FUNCTION__, __FILE__, __LINE__); + // This is not a fatal error - the thread just doesn't exist any more + return true; + } + + struct dirent *dirent; + while ((dirent = readdir(task)) != NULL) { + char *endptr; + const int tid = strtol(dirent->d_name, &endptr, 10); + if (*endptr != '\0') { + // Ignore task items that are not integers like ., etc... + continue; + } + + if (!printb->printf("/proc/%i/task/%i/stat", pid, tid)) { + logg->logMessage("%s(%s:%i): DynBuf::printf failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } + ProcStat ps; + if (!readProcStat(&ps, printb->getBuf(), b1)) { + logg->logMessage("%s(%s:%i): readProcStat failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } + + const char *const image = readProcExe(printb, pid, tid, b2); + if (image == NULL) { + logg->logMessage("%s(%s:%i): readImage failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } + + buffer->comm(currTime, pid, tid, image, ps.comm); + } + + result = true; + + fail: + closedir(task); + + return result; +} + +bool readProcComms(const uint64_t currTime, Buffer *const buffer, DynBuf *const printb, DynBuf *const b1, DynBuf *const b2) { + bool result = false; + + DIR *proc = opendir("/proc"); + if (proc == NULL) { + logg->logMessage("%s(%s:%i): opendir failed", __FUNCTION__, __FILE__, __LINE__); + return result; + } + + struct dirent *dirent; + while ((dirent = readdir(proc)) != NULL) { + char *endptr; + const int pid = strtol(dirent->d_name, &endptr, 10); + if (*endptr != '\0') { + // Ignore proc items that are not integers like ., cpuinfo, etc... + continue; + } + + if (!printb->printf("/proc/%i/stat", pid)) { + logg->logMessage("%s(%s:%i): DynBuf::printf failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } + ProcStat ps; + if (!readProcStat(&ps, printb->getBuf(), b1)) { + logg->logMessage("%s(%s:%i): readProcStat failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } + + if (ps.numThreads <= 1) { + const char *const image = readProcExe(printb, pid, -1, b1); + if (image == NULL) { + logg->logMessage("%s(%s:%i): readImage failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } + + buffer->comm(currTime, pid, pid, image, ps.comm); + } else { + if (!readProcTask(currTime, buffer, pid, printb, b1, b2)) { + logg->logMessage("%s(%s:%i): readProcTask failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } + } + } + + result = true; + + fail: + closedir(proc); + + return result; +} + +bool readProcMaps(const uint64_t currTime, Buffer *const buffer, DynBuf *const printb, DynBuf *const b) { + bool result = false; + + DIR *proc = opendir("/proc"); + if (proc == NULL) { + logg->logMessage("%s(%s:%i): opendir failed", __FUNCTION__, __FILE__, __LINE__); + return result; + } + + struct dirent *dirent; + while ((dirent = readdir(proc)) != NULL) { + char *endptr; + const int pid = strtol(dirent->d_name, &endptr, 10); + if (*endptr != '\0') { + // Ignore proc items that are not integers like ., cpuinfo, etc... + continue; + } + + if (!printb->printf("/proc/%i/maps", pid)) { + logg->logMessage("%s(%s:%i): DynBuf::printf failed", __FUNCTION__, __FILE__, __LINE__); + goto fail; + } + if (!b->read(printb->getBuf())) { + logg->logMessage("%s(%s:%i): DynBuf::read failed, likely because the process exited", __FUNCTION__, __FILE__, __LINE__); + // This is not a fatal error - the process just doesn't exist any more + continue; + } + + buffer->maps(currTime, pid, pid, b->getBuf()); + } + + result = true; + + fail: + closedir(proc); + + return result; +} + +bool readKallsyms(const uint64_t currTime, Buffer *const buffer, const bool *const isDone) { + int fd = ::open("/proc/kallsyms", O_RDONLY | O_CLOEXEC); + + if (fd < 0) { + logg->logMessage("%s(%s:%i): open failed", __FUNCTION__, __FILE__, __LINE__); + return true; + }; + + char buf[1<<12]; + ssize_t pos = 0; + while (gSessionData->mSessionIsActive && !ACCESS_ONCE(*isDone)) { + // Assert there is still space in the buffer + if (sizeof(buf) - pos - 1 == 0) { + logg->logError(__FILE__, __LINE__, "no space left in buffer"); + handleException(); + } + + { + // -1 to reserve space for \0 + const ssize_t bytes = ::read(fd, buf + pos, sizeof(buf) - pos - 1); + if (bytes < 0) { + logg->logError(__FILE__, __LINE__, "read failed", __FUNCTION__, __FILE__, __LINE__); + handleException(); + } + if (bytes == 0) { + // Assert the buffer is empty + if (pos != 0) { + logg->logError(__FILE__, __LINE__, "buffer not empty on eof"); + handleException(); + } + break; + } + pos += bytes; + } + + ssize_t newline; + // Find the last '\n' + for (newline = pos - 1; newline >= 0; --newline) { + if (buf[newline] == '\n') { + const char was = buf[newline + 1]; + buf[newline + 1] = '\0'; + buffer->kallsyms(currTime, buf); + // Sleep 3 ms to avoid sending out too much data too quickly + usleep(3000); + buf[0] = was; + // Assert the memory regions do not overlap + if (pos - newline >= newline + 1) { + logg->logError(__FILE__, __LINE__, "memcpy src and dst overlap"); + handleException(); + } + if (pos - newline - 2 > 0) { + memcpy(buf + 1, buf + newline + 2, pos - newline - 2); + } + pos -= newline + 1; + break; + } + } + } + + close(fd); + + return true; +} diff --git a/tools/gator/daemon/Proc.h b/tools/gator/daemon/Proc.h new file mode 100644 index 00000000..2a1a7cbc --- /dev/null +++ b/tools/gator/daemon/Proc.h @@ -0,0 +1,21 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef PROC_H +#define PROC_H + +#include + +class Buffer; +class DynBuf; + +bool readProcComms(const uint64_t currTime, Buffer *const buffer, DynBuf *const printb, DynBuf *const b1, DynBuf *const b2); +bool readProcMaps(const uint64_t currTime, Buffer *const buffer, DynBuf *const printb, DynBuf *const b); +bool readKallsyms(const uint64_t currTime, Buffer *const buffer, const bool *const isDone); + +#endif // PROC_H diff --git a/tools/gator/daemon/Sender.cpp b/tools/gator/daemon/Sender.cpp new file mode 100644 index 00000000..8a54a667 --- /dev/null +++ b/tools/gator/daemon/Sender.cpp @@ -0,0 +1,129 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Sender.h" + +#include +#include +#include + +#include "Buffer.h" +#include "Logging.h" +#include "OlySocket.h" +#include "SessionData.h" + +Sender::Sender(OlySocket* socket) { + mDataFile = NULL; + mDataSocket = NULL; + + // Set up the socket connection + if (socket) { + char streamline[64] = {0}; + mDataSocket = socket; + + // Receive magic sequence - can wait forever + // Streamline will send data prior to the magic sequence for legacy support, which should be ignored for v4+ + while (strcmp("STREAMLINE", streamline) != 0) { + if (mDataSocket->receiveString(streamline, sizeof(streamline)) == -1) { + logg->logError(__FILE__, __LINE__, "Socket disconnected"); + handleException(); + } + } + + // Send magic sequence - must be done first, after which error messages can be sent + char magic[32]; + snprintf(magic, 32, "GATOR %i\n", PROTOCOL_VERSION); + mDataSocket->send(magic, strlen(magic)); + + gSessionData->mWaitingOnCommand = true; + logg->logMessage("Completed magic sequence"); + } + + pthread_mutex_init(&mSendMutex, NULL); +} + +Sender::~Sender() { + // Just close it as the client socket is on the stack + if (mDataSocket != NULL) { + mDataSocket->closeSocket(); + mDataSocket = NULL; + } + if (mDataFile != NULL) { + fclose(mDataFile); + } +} + +void Sender::createDataFile(char* apcDir) { + if (apcDir == NULL) { + return; + } + + mDataFileName = (char*)malloc(strlen(apcDir) + 12); + sprintf(mDataFileName, "%s/0000000000", apcDir); + mDataFile = fopen_cloexec(mDataFileName, "wb"); + if (!mDataFile) { + logg->logError(__FILE__, __LINE__, "Failed to open binary file: %s", mDataFileName); + handleException(); + } +} + +void Sender::writeData(const char* data, int length, int type) { + if (length < 0 || (data == NULL && length > 0)) { + return; + } + + // Multiple threads call writeData() + pthread_mutex_lock(&mSendMutex); + + // Send data over the socket connection + if (mDataSocket) { + // Start alarm + const int alarmDuration = 8; + alarm(alarmDuration); + + // Send data over the socket, sending the type and size first + logg->logMessage("Sending data with length %d", length); + if (type != RESPONSE_APC_DATA) { + // type and length already added by the Collector for apc data + unsigned char header[5]; + header[0] = type; + Buffer::writeLEInt(header + 1, length); + mDataSocket->send((char*)&header, sizeof(header)); + } + + // 100Kbits/sec * alarmDuration sec / 8 bits/byte + const int chunkSize = 100*1000 * alarmDuration / 8; + int pos = 0; + while (true) { + mDataSocket->send((const char*)data + pos, min(length - pos, chunkSize)); + pos += chunkSize; + if (pos >= length) { + break; + } + + // Reset the alarm + alarm(alarmDuration); + logg->logMessage("Resetting the alarm"); + } + + // Stop alarm + alarm(0); + } + + // Write data to disk as long as it is not meta data + if (mDataFile && type == RESPONSE_APC_DATA) { + logg->logMessage("Writing data with length %d", length); + // Send data to the data file + if (fwrite(data, 1, length, mDataFile) != (unsigned int)length) { + logg->logError(__FILE__, __LINE__, "Failed writing binary file %s", mDataFileName); + handleException(); + } + } + + pthread_mutex_unlock(&mSendMutex); +} diff --git a/tools/gator/daemon/Sender.h b/tools/gator/daemon/Sender.h new file mode 100644 index 00000000..5aa91171 --- /dev/null +++ b/tools/gator/daemon/Sender.h @@ -0,0 +1,42 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __SENDER_H__ +#define __SENDER_H__ + +#include +#include + +class OlySocket; + +enum { + RESPONSE_XML = 1, + RESPONSE_APC_DATA = 3, + RESPONSE_ACK = 4, + RESPONSE_NAK = 5, + RESPONSE_ERROR = 0xFF +}; + +class Sender { +public: + Sender(OlySocket* socket); + ~Sender(); + void writeData(const char* data, int length, int type); + void createDataFile(char* apcDir); +private: + OlySocket* mDataSocket; + FILE* mDataFile; + char* mDataFileName; + pthread_mutex_t mSendMutex; + + // Intentionally unimplemented + Sender(const Sender &); + Sender &operator=(const Sender &); +}; + +#endif //__SENDER_H__ diff --git a/tools/gator/daemon/SessionData.cpp b/tools/gator/daemon/SessionData.cpp new file mode 100644 index 00000000..0e65d784 --- /dev/null +++ b/tools/gator/daemon/SessionData.cpp @@ -0,0 +1,261 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "SessionData.h" + +#include +#include +#include +#include + +#include "CPUFreqDriver.h" +#include "DiskIODriver.h" +#include "FSDriver.h" +#include "HwmonDriver.h" +#include "Logging.h" +#include "MemInfoDriver.h" +#include "NetDriver.h" +#include "SessionXML.h" + +#define CORE_NAME_UNKNOWN "unknown" + +SessionData* gSessionData = NULL; + +SessionData::SessionData() { + usDrivers[0] = new HwmonDriver(); + usDrivers[1] = new FSDriver(); + usDrivers[2] = new MemInfoDriver(); + usDrivers[3] = new NetDriver(); + usDrivers[4] = new CPUFreqDriver(); + usDrivers[5] = new DiskIODriver(); + initialize(); +} + +SessionData::~SessionData() { +} + +void SessionData::initialize() { + mWaitingOnCommand = false; + mSessionIsActive = false; + mLocalCapture = false; + mOneShot = false; + mSentSummary = false; + mAllowCommands = false; + const size_t cpuIdSize = sizeof(int)*NR_CPUS; + // Share mCpuIds across all instances of gatord + mCpuIds = (int *)mmap(NULL, cpuIdSize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (mCpuIds == MAP_FAILED) { + logg->logError(__FILE__, __LINE__, "Unable to mmap shared memory for cpuids"); + handleException(); + } + memset(mCpuIds, -1, cpuIdSize); + strcpy(mCoreName, CORE_NAME_UNKNOWN); + readModel(); + readCpuInfo(); + mImages = NULL; + mConfigurationXMLPath = NULL; + mSessionXMLPath = NULL; + mEventsXMLPath = NULL; + mTargetPath = NULL; + mAPCDir = NULL; + mCaptureWorkingDir = NULL; + mCaptureCommand = NULL; + mCaptureUser = NULL; + mSampleRate = 0; + mLiveRate = 0; + mDuration = 0; + mMonotonicStarted = -1; + mBacktraceDepth = 0; + mTotalBufferSize = 0; + // sysconf(_SC_NPROCESSORS_CONF) is unreliable on 2.6 Android, get the value from the kernel module + mCores = 1; + mPageSize = 0; +} + +void SessionData::parseSessionXML(char* xmlString) { + SessionXML session(xmlString); + session.parse(); + + // Set session data values - use prime numbers just below the desired value to reduce the chance of events firing at the same time + if (strcmp(session.parameters.sample_rate, "high") == 0) { + mSampleRate = 9973; // 10000 + } else if (strcmp(session.parameters.sample_rate, "normal") == 0) { + mSampleRate = 997; // 1000 + } else if (strcmp(session.parameters.sample_rate, "low") == 0) { + mSampleRate = 97; // 100 + } else if (strcmp(session.parameters.sample_rate, "none") == 0) { + mSampleRate = 0; + } else { + logg->logError(__FILE__, __LINE__, "Invalid sample rate (%s) in session xml.", session.parameters.sample_rate); + handleException(); + } + mBacktraceDepth = session.parameters.call_stack_unwinding == true ? 128 : 0; + + // Determine buffer size (in MB) based on buffer mode + mOneShot = true; + if (strcmp(session.parameters.buffer_mode, "streaming") == 0) { + mOneShot = false; + mTotalBufferSize = 1; + } else if (strcmp(session.parameters.buffer_mode, "small") == 0) { + mTotalBufferSize = 1; + } else if (strcmp(session.parameters.buffer_mode, "normal") == 0) { + mTotalBufferSize = 4; + } else if (strcmp(session.parameters.buffer_mode, "large") == 0) { + mTotalBufferSize = 16; + } else { + logg->logError(__FILE__, __LINE__, "Invalid value for buffer mode in session xml."); + handleException(); + } + + // Convert milli- to nanoseconds + mLiveRate = session.parameters.live_rate * (int64_t)1000000; + if (mLiveRate > 0 && mLocalCapture) { + logg->logMessage("Local capture is not compatable with live, disabling live"); + mLiveRate = 0; + } + + if (!mAllowCommands && (mCaptureCommand != NULL)) { + logg->logError(__FILE__, __LINE__, "Running a command during a capture is not currently allowed. Please restart gatord with the -a flag."); + handleException(); + } +} + +void SessionData::readModel() { + FILE *fh = fopen("/proc/device-tree/model", "rb"); + if (fh == NULL) { + return; + } + + char buf[256]; + if (fgets(buf, sizeof(buf), fh) != NULL) { + strcpy(mCoreName, buf); + } + + fclose(fh); +} + +void SessionData::readCpuInfo() { + char temp[256]; // arbitrarily large amount + mMaxCpuId = -1; + + FILE *f = fopen("/proc/cpuinfo", "r"); + if (f == NULL) { + logg->logMessage("Error opening /proc/cpuinfo\n" + "The core name in the captured xml file will be 'unknown'."); + return; + } + + bool foundCoreName = false; + int processor = -1; + while (fgets(temp, sizeof(temp), f)) { + const size_t len = strlen(temp); + + if (len == 1) { + // New section, clear the processor. Streamline will not know the cpus if the pre Linux 3.8 format of cpuinfo is encountered but also that no incorrect information will be transmitted. + processor = -1; + continue; + } + + if (len > 0) { + // Replace the line feed with a null + temp[len - 1] = '\0'; + } + + const bool foundHardware = strstr(temp, "Hardware") != 0; + const bool foundCPUPart = strstr(temp, "CPU part") != 0; + const bool foundProcessor = strstr(temp, "processor") != 0; + if (foundHardware || foundCPUPart || foundProcessor) { + char* position = strchr(temp, ':'); + if (position == NULL || (unsigned int)(position - temp) + 2 >= strlen(temp)) { + logg->logMessage("Unknown format of /proc/cpuinfo\n" + "The core name in the captured xml file will be 'unknown'."); + return; + } + position += 2; + + if (foundHardware && (strcmp(mCoreName, CORE_NAME_UNKNOWN) == 0)) { + strncpy(mCoreName, position, sizeof(mCoreName)); + mCoreName[sizeof(mCoreName) - 1] = 0; // strncpy does not guarantee a null-terminated string + foundCoreName = true; + } + + if (foundCPUPart) { + const int cpuId = strtol(position, NULL, 0); + // If this does not have the full topology in /proc/cpuinfo, mCpuIds[0] may not have the 1 CPU part emitted - this guarantees it's in mMaxCpuId + if (cpuId > mMaxCpuId) { + mMaxCpuId = cpuId; + } + if (processor >= NR_CPUS) { + logg->logMessage("Too many processors, please increase NR_CPUS"); + } else if (processor >= 0) { + mCpuIds[processor] = cpuId; + } + } + + if (foundProcessor) { + processor = strtol(position, NULL, 0); + } + } + } + + if (!foundCoreName) { + logg->logMessage("Could not determine core name from /proc/cpuinfo\n" + "The core name in the captured xml file will be 'unknown'."); + } + fclose(f); +} + +uint64_t getTime() { + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts) != 0) { + logg->logError(__FILE__, __LINE__, "Failed to get uptime"); + handleException(); + } + return (NS_PER_S*ts.tv_sec + ts.tv_nsec); +} + +int getEventKey() { + // key 0 is reserved as a timestamp + // key 1 is reserved as the marker for thread specific counters + // key 2 is reserved as the marker for core + // Odd keys are assigned by the driver, even keys by the daemon + static int key = 4; + + const int ret = key; + key += 2; + return ret; +} + +int pipe_cloexec(int pipefd[2]) { + if (pipe(pipefd) != 0) { + return -1; + } + + int fdf; + if (((fdf = fcntl(pipefd[0], F_GETFD)) == -1) || (fcntl(pipefd[0], F_SETFD, fdf | FD_CLOEXEC) != 0) || + ((fdf = fcntl(pipefd[1], F_GETFD)) == -1) || (fcntl(pipefd[1], F_SETFD, fdf | FD_CLOEXEC) != 0)) { + close(pipefd[0]); + close(pipefd[1]); + return -1; + } + return 0; +} + +FILE *fopen_cloexec(const char *path, const char *mode) { + FILE *fh = fopen(path, mode); + if (fh == NULL) { + return NULL; + } + int fd = fileno(fh); + int fdf = fcntl(fd, F_GETFD); + if ((fdf == -1) || (fcntl(fd, F_SETFD, fdf | FD_CLOEXEC) != 0)) { + fclose(fh); + return NULL; + } + return fh; +} diff --git a/tools/gator/daemon/SessionData.h b/tools/gator/daemon/SessionData.h new file mode 100644 index 00000000..ed282af4 --- /dev/null +++ b/tools/gator/daemon/SessionData.h @@ -0,0 +1,102 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef SESSION_DATA_H +#define SESSION_DATA_H + +#include + +#include "AnnotateListener.h" +#include "Config.h" +#include "Counter.h" +#include "FtraceDriver.h" +#include "KMod.h" +#include "MaliVideoDriver.h" +#include "PerfDriver.h" + +#define PROTOCOL_VERSION 20 +// Differentiates development versions (timestamp) from release versions +#define PROTOCOL_DEV 1000 + +#define NS_PER_S 1000000000LL +#define NS_PER_MS 1000000LL +#define NS_PER_US 1000LL + +struct ImageLinkList { + char* path; + struct ImageLinkList *next; +}; + +class SessionData { +public: + static const size_t MAX_STRING_LEN = 80; + + SessionData(); + ~SessionData(); + void initialize(); + void parseSessionXML(char* xmlString); + void readModel(); + void readCpuInfo(); + + PolledDriver *usDrivers[6]; + KMod kmod; + PerfDriver perf; + MaliVideoDriver maliVideo; + FtraceDriver ftraceDriver; + AnnotateListener annotateListener; + + char mCoreName[MAX_STRING_LEN]; + struct ImageLinkList *mImages; + char *mConfigurationXMLPath; + char *mSessionXMLPath; + char *mEventsXMLPath; + char *mTargetPath; + char *mAPCDir; + char *mCaptureWorkingDir; + char *mCaptureCommand; + char *mCaptureUser; + + bool mWaitingOnCommand; + bool mSessionIsActive; + bool mLocalCapture; + // halt processing of the driver data until profiling is complete or the buffer is filled + bool mOneShot; + bool mIsEBS; + bool mSentSummary; + bool mAllowCommands; + + int64_t mMonotonicStarted; + int mBacktraceDepth; + // number of MB to use for the entire collection buffer + int mTotalBufferSize; + int mSampleRate; + int64_t mLiveRate; + int mDuration; + int mCores; + int mPageSize; + int *mCpuIds; + int mMaxCpuId; + + // PMU Counters + int mCounterOverflow; + Counter mCounters[MAX_PERFORMANCE_COUNTERS]; + +private: + // Intentionally unimplemented + SessionData(const SessionData &); + SessionData &operator=(const SessionData &); +}; + +extern SessionData* gSessionData; + +uint64_t getTime(); +int getEventKey(); +int pipe_cloexec(int pipefd[2]); +FILE *fopen_cloexec(const char *path, const char *mode); + +#endif // SESSION_DATA_H diff --git a/tools/gator/daemon/SessionXML.cpp b/tools/gator/daemon/SessionXML.cpp new file mode 100644 index 00000000..dea4c8f2 --- /dev/null +++ b/tools/gator/daemon/SessionXML.cpp @@ -0,0 +1,111 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "SessionXML.h" + +#include +#include +#include + +#include "Logging.h" +#include "OlyUtility.h" +#include "SessionData.h" + +static const char *TAG_SESSION = "session"; +static const char *TAG_IMAGE = "image"; + +static const char *ATTR_VERSION = "version"; +static const char *ATTR_CALL_STACK_UNWINDING = "call_stack_unwinding"; +static const char *ATTR_BUFFER_MODE = "buffer_mode"; +static const char *ATTR_SAMPLE_RATE = "sample_rate"; +static const char *ATTR_DURATION = "duration"; +static const char *ATTR_PATH = "path"; +static const char *ATTR_LIVE_RATE = "live_rate"; +static const char *ATTR_CAPTURE_WORKING_DIR = "capture_working_dir"; +static const char *ATTR_CAPTURE_COMMAND = "capture_command"; +static const char *ATTR_CAPTURE_USER = "capture_user"; + +SessionXML::SessionXML(const char *str) { + parameters.buffer_mode[0] = 0; + parameters.sample_rate[0] = 0; + parameters.call_stack_unwinding = false; + parameters.live_rate = 0; + mSessionXML = str; + logg->logMessage(mSessionXML); +} + +SessionXML::~SessionXML() { +} + +void SessionXML::parse() { + mxml_node_t *tree; + mxml_node_t *node; + + tree = mxmlLoadString(NULL, mSessionXML, MXML_NO_CALLBACK); + node = mxmlFindElement(tree, tree, TAG_SESSION, NULL, NULL, MXML_DESCEND); + + if (node) { + sessionTag(tree, node); + mxmlDelete(tree); + return; + } + + logg->logError(__FILE__, __LINE__, "No session tag found in the session.xml file"); + handleException(); +} + +void SessionXML::sessionTag(mxml_node_t *tree, mxml_node_t *node) { + int version = 0; + if (mxmlElementGetAttr(node, ATTR_VERSION)) version = strtol(mxmlElementGetAttr(node, ATTR_VERSION), NULL, 10); + if (version != 1) { + logg->logError(__FILE__, __LINE__, "Invalid session.xml version: %d", version); + handleException(); + } + + // copy to pre-allocated strings + if (mxmlElementGetAttr(node, ATTR_BUFFER_MODE)) { + strncpy(parameters.buffer_mode, mxmlElementGetAttr(node, ATTR_BUFFER_MODE), sizeof(parameters.buffer_mode)); + parameters.buffer_mode[sizeof(parameters.buffer_mode) - 1] = 0; // strncpy does not guarantee a null-terminated string + } + if (mxmlElementGetAttr(node, ATTR_SAMPLE_RATE)) { + strncpy(parameters.sample_rate, mxmlElementGetAttr(node, ATTR_SAMPLE_RATE), sizeof(parameters.sample_rate)); + parameters.sample_rate[sizeof(parameters.sample_rate) - 1] = 0; // strncpy does not guarantee a null-terminated string + } + if (mxmlElementGetAttr(node, ATTR_CAPTURE_WORKING_DIR)) gSessionData->mCaptureWorkingDir = strdup(mxmlElementGetAttr(node, ATTR_CAPTURE_WORKING_DIR)); + if (mxmlElementGetAttr(node, ATTR_CAPTURE_COMMAND)) gSessionData->mCaptureCommand = strdup(mxmlElementGetAttr(node, ATTR_CAPTURE_COMMAND)); + if (mxmlElementGetAttr(node, ATTR_CAPTURE_USER)) gSessionData->mCaptureUser = strdup(mxmlElementGetAttr(node, ATTR_CAPTURE_USER)); + + // integers/bools + parameters.call_stack_unwinding = util->stringToBool(mxmlElementGetAttr(node, ATTR_CALL_STACK_UNWINDING), false); + if (mxmlElementGetAttr(node, ATTR_DURATION)) gSessionData->mDuration = strtol(mxmlElementGetAttr(node, ATTR_DURATION), NULL, 10); + if (mxmlElementGetAttr(node, ATTR_LIVE_RATE)) parameters.live_rate = strtol(mxmlElementGetAttr(node, ATTR_LIVE_RATE), NULL, 10); + + // parse subtags + node = mxmlGetFirstChild(node); + while (node) { + if (mxmlGetType(node) != MXML_ELEMENT) { + node = mxmlWalkNext(node, tree, MXML_NO_DESCEND); + continue; + } + if (strcmp(TAG_IMAGE, mxmlGetElement(node)) == 0) { + sessionImage(node); + } + node = mxmlWalkNext(node, tree, MXML_NO_DESCEND); + } +} + +void SessionXML::sessionImage(mxml_node_t *node) { + int length = strlen(mxmlElementGetAttr(node, ATTR_PATH)); + struct ImageLinkList *image; + + image = (struct ImageLinkList *)malloc(sizeof(struct ImageLinkList)); + image->path = (char*)malloc(length + 1); + image->path = strdup(mxmlElementGetAttr(node, ATTR_PATH)); + image->next = gSessionData->mImages; + gSessionData->mImages = image; +} diff --git a/tools/gator/daemon/SessionXML.h b/tools/gator/daemon/SessionXML.h new file mode 100644 index 00000000..53965749 --- /dev/null +++ b/tools/gator/daemon/SessionXML.h @@ -0,0 +1,42 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef SESSION_XML_H +#define SESSION_XML_H + +#include "mxml/mxml.h" + +struct ImageLinkList; + +struct ConfigParameters { + // buffer mode, "streaming", "low", "normal", "high" defines oneshot and buffer size + char buffer_mode[64]; + // capture mode, "high", "normal", or "low" + char sample_rate[64]; + // whether stack unwinding is performed + bool call_stack_unwinding; + int live_rate; +}; + +class SessionXML { +public: + SessionXML(const char *str); + ~SessionXML(); + void parse(); + ConfigParameters parameters; +private: + const char *mSessionXML; + void sessionTag(mxml_node_t *tree, mxml_node_t *node); + void sessionImage(mxml_node_t *node); + + // Intentionally unimplemented + SessionXML(const SessionXML &); + SessionXML &operator=(const SessionXML &); +}; + +#endif // SESSION_XML_H diff --git a/tools/gator/daemon/Setup.cpp b/tools/gator/daemon/Setup.cpp new file mode 100644 index 00000000..d4ce0328 --- /dev/null +++ b/tools/gator/daemon/Setup.cpp @@ -0,0 +1,232 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Setup.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Config.h" +#include "DynBuf.h" +#include "Logging.h" + +bool getLinuxVersion(int version[3]) { + // Check the kernel version + struct utsname utsname; + if (uname(&utsname) != 0) { + logg->logMessage("%s(%s:%i): uname failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + version[0] = 0; + version[1] = 0; + version[2] = 0; + + int part = 0; + char *ch = utsname.release; + while (*ch >= '0' && *ch <= '9' && part < 3) { + version[part] = 10*version[part] + *ch - '0'; + + ++ch; + if (*ch == '.') { + ++part; + ++ch; + } + } + + return true; +} + +static int pgrep_gator(DynBuf *const printb) { + DynBuf b; + + DIR *proc = opendir("/proc"); + if (proc == NULL) { + logg->logError(__FILE__, __LINE__, "gator: error: opendir failed"); + handleException(); + } + + int self = getpid(); + + struct dirent *dirent; + while ((dirent = readdir(proc)) != NULL) { + char *endptr; + const int pid = strtol(dirent->d_name, &endptr, 10); + if (*endptr != '\0' || (pid == self)) { + // Ignore proc items that are not integers like ., cpuinfo, etc... + continue; + } + + if (!printb->printf("/proc/%i/stat", pid)) { + logg->logError(__FILE__, __LINE__, "gator: error: DynBuf::printf failed"); + handleException(); + } + + if (!b.read(printb->getBuf())) { + // This is not a fatal error - the thread just doesn't exist any more + continue; + } + + char *comm = strchr(b.getBuf(), '('); + if (comm == NULL) { + logg->logError(__FILE__, __LINE__, "gator: error: parsing stat begin failed"); + handleException(); + } + ++comm; + char *const str = strrchr(comm, ')'); + if (str == NULL) { + logg->logError(__FILE__, __LINE__, "gator: error: parsing stat end failed"); + handleException(); + } + *str = '\0'; + + if (strncmp(comm, "gator", 5) == 0) { + // Assume there is only one gator process + return pid; + } + } + + closedir(proc); + + return -1; +} + +int update(const char *const gatorPath) { + printf("gator: starting\n"); + + int version[3]; + if (!getLinuxVersion(version)) { + logg->logError(__FILE__, __LINE__, "gator: error: getLinuxVersion failed"); + handleException(); + } + + if (KERNEL_VERSION(version[0], version[1], version[2]) < KERNEL_VERSION(2, 6, 32)) { + logg->logError(__FILE__, __LINE__, "gator: error: Streamline can't automatically setup gator as this kernel version is not supported. Please upgrade the kernel on your device."); + handleException(); + } + + if (KERNEL_VERSION(version[0], version[1], version[2]) < KERNEL_VERSION(3, 4, 0)) { + logg->logError(__FILE__, __LINE__, "gator: error: Streamline can't automatically setup gator as gator.ko is required for this version of Linux. Please build gator.ko and gatord and install them on your device."); + handleException(); + } + + if (access("/sys/module/gator", F_OK) == 0) { + logg->logError(__FILE__, __LINE__, "gator: error: Streamline has detected that the gator kernel module is loaded on your device. Please build an updated version of gator.ko and gatord and install them on your device."); + handleException(); + } + + if (geteuid() != 0) { + printf("gator: trying sudo\n"); + execlp("sudo", "sudo", gatorPath, "-u", NULL); + // Streamline will provide the password if needed + + printf("gator: trying su\n"); + char buf[1<<10]; + snprintf(buf, sizeof(buf), "%s -u", gatorPath); + execlp("su", "su", "-", "-c", buf, NULL); + // Streamline will provide the password if needed + + logg->logError(__FILE__, __LINE__, "gator: error: Streamline was unable to sudo to root on your device. Please double check passwords, ensure sudo or su work with this user or try a different username."); + handleException(); + } + printf("gator: now root\n"); + + // setenforce 0 not needed for userspace gator + + // Kill existing gator + DynBuf gatorStatPath; + int gator_main = pgrep_gator(&gatorStatPath); + if (gator_main > 0) { + if (kill(gator_main, SIGTERM) != 0) { + logg->logError(__FILE__, __LINE__, "gator: error: kill SIGTERM failed"); + handleException(); + } + for (int i = 0; ; ++i) { + if (access(gatorStatPath.getBuf(), F_OK) != 0) { + break; + } + if (i == 5) { + if (kill(gator_main, SIGKILL) != 0) { + logg->logError(__FILE__, __LINE__, "gator: error: kill SIGKILL failed"); + handleException(); + } + } else if (i >= 10) { + logg->logError(__FILE__, __LINE__, "gator: error: unable to kill running gator"); + handleException(); + } + sleep(1); + } + } + printf("gator: no gatord running\n"); + + rename("gatord", "gatord.old"); + rename("gator.ko", "gator.ko.old"); + + // Rename gatord.YYYYMMDDHHMMSSMMMM to gatord + char *newGatorPath = strdup(gatorPath); + char *dot = strrchr(newGatorPath, '.'); + if (dot != NULL) { + *dot = '\0'; + if (rename(gatorPath, newGatorPath) != 0) { + logg->logError(__FILE__, __LINE__, "gator: error: rename failed"); + handleException(); + } + } + + // Fork and start gatord (redirect stdout and stderr) + int child = fork(); + if (child < 0) { + logg->logError(__FILE__, __LINE__, "gator: error: fork failed"); + handleException(); + } else if (child == 0) { + int inFd = open("/dev/null", O_RDONLY | O_CLOEXEC); + if (inFd < 0) { + logg->logError(__FILE__, __LINE__, "gator: error: open of /dev/null failed"); + handleException(); + } + int outFd = open("gatord.out", O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0600); + if (outFd < 0) { + logg->logError(__FILE__, __LINE__, "gator: error: open of gatord.out failed"); + handleException(); + } + int errFd = open("gatord.err", O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0600); + if (errFd < 0) { + logg->logError(__FILE__, __LINE__, "gator: error: open of gatord.err failed"); + handleException(); + } + if (dup2(inFd, STDIN_FILENO) < 0) { + logg->logError(__FILE__, __LINE__, "gator: error: dup2 for stdin failed"); + handleException(); + } + if (dup2(outFd, STDOUT_FILENO) < 0) { + logg->logError(__FILE__, __LINE__, "gator: error: dup2 for stdout failed"); + handleException(); + } + if (dup2(errFd, STDERR_FILENO) < 0) { + logg->logError(__FILE__, __LINE__, "gator: error: dup2 for stderr failed"); + handleException(); + } + execlp(newGatorPath, newGatorPath, "-a", NULL); + logg->logError(__FILE__, __LINE__, "gator: error: execlp failed"); + handleException(); + } + + printf("gator: done\n"); + + return 0; +} diff --git a/tools/gator/daemon/Setup.h b/tools/gator/daemon/Setup.h new file mode 100644 index 00000000..280d6113 --- /dev/null +++ b/tools/gator/daemon/Setup.h @@ -0,0 +1,18 @@ +/** + * Copyright (C) ARM Limited 2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef SETUP_H +#define SETUP_H + +// From include/generated/uapi/linux/version.h +#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) + +bool getLinuxVersion(int version[3]); +int update(const char *const gatorPath); + +#endif // SETUP_H diff --git a/tools/gator/daemon/Source.cpp b/tools/gator/daemon/Source.cpp new file mode 100644 index 00000000..60cf704e --- /dev/null +++ b/tools/gator/daemon/Source.cpp @@ -0,0 +1,33 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "Source.h" + +#include "Logging.h" + +Source::Source() : mThreadID() { +} + +Source::~Source() { +} + +void Source::start() { + if (pthread_create(&mThreadID, NULL, runStatic, this)) { + logg->logError(__FILE__, __LINE__, "Failed to create source thread"); + handleException(); + } +} + +void Source::join() { + pthread_join(mThreadID, NULL); +} + +void *Source::runStatic(void *arg) { + static_cast(arg)->run(); + return NULL; +} diff --git a/tools/gator/daemon/Source.h b/tools/gator/daemon/Source.h new file mode 100644 index 00000000..56ac3d6e --- /dev/null +++ b/tools/gator/daemon/Source.h @@ -0,0 +1,40 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef SOURCE_H +#define SOURCE_H + +#include + +class Sender; + +class Source { +public: + Source(); + virtual ~Source(); + + virtual bool prepare() = 0; + void start(); + virtual void run() = 0; + virtual void interrupt() = 0; + void join(); + + virtual bool isDone() = 0; + virtual void write(Sender *sender) = 0; + +private: + static void *runStatic(void *arg); + + pthread_t mThreadID; + + // Intentionally undefined + Source(const Source &); + Source &operator=(const Source &); +}; + +#endif // SOURCE_H diff --git a/tools/gator/daemon/StreamlineSetup.cpp b/tools/gator/daemon/StreamlineSetup.cpp new file mode 100644 index 00000000..2b61eaeb --- /dev/null +++ b/tools/gator/daemon/StreamlineSetup.cpp @@ -0,0 +1,272 @@ +/** + * Copyright (C) ARM Limited 2011-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "StreamlineSetup.h" + +#include "Buffer.h" +#include "CapturedXML.h" +#include "ConfigurationXML.h" +#include "Driver.h" +#include "EventsXML.h" +#include "Logging.h" +#include "OlySocket.h" +#include "OlyUtility.h" +#include "Sender.h" +#include "SessionData.h" + +static const char* TAG_SESSION = "session"; +static const char* TAG_REQUEST = "request"; +static const char* TAG_CONFIGURATIONS = "configurations"; + +static const char* ATTR_TYPE = "type"; +static const char* VALUE_EVENTS = "events"; +static const char* VALUE_CONFIGURATION = "configuration"; +static const char* VALUE_COUNTERS = "counters"; +static const char* VALUE_CAPTURED = "captured"; +static const char* VALUE_DEFAULTS = "defaults"; + +StreamlineSetup::StreamlineSetup(OlySocket* s) { + bool ready = false; + char* data = NULL; + int type; + + mSocket = s; + + // Receive commands from Streamline (master) + while (!ready) { + // receive command over socket + gSessionData->mWaitingOnCommand = true; + data = readCommand(&type); + + // parse and handle data + switch (type) { + case COMMAND_REQUEST_XML: + handleRequest(data); + break; + case COMMAND_DELIVER_XML: + handleDeliver(data); + break; + case COMMAND_APC_START: + logg->logMessage("Received apc start request"); + ready = true; + break; + case COMMAND_APC_STOP: + logg->logMessage("Received apc stop request before apc start request"); + exit(0); + break; + case COMMAND_DISCONNECT: + logg->logMessage("Received disconnect command"); + exit(0); + break; + case COMMAND_PING: + logg->logMessage("Received ping command"); + sendData(NULL, 0, RESPONSE_ACK); + break; + default: + logg->logError(__FILE__, __LINE__, "Target error: Unknown command type, %d", type); + handleException(); + } + + free(data); + } + + if (gSessionData->mCounterOverflow > 0) { + logg->logError(__FILE__, __LINE__, "Only %i performance counters are permitted, %i are selected", MAX_PERFORMANCE_COUNTERS, gSessionData->mCounterOverflow); + handleException(); + } +} + +StreamlineSetup::~StreamlineSetup() { +} + +char* StreamlineSetup::readCommand(int* command) { + unsigned char header[5]; + char* data; + int response; + + // receive type and length + response = mSocket->receiveNBytes((char*)&header, sizeof(header)); + + // After receiving a single byte, we are no longer waiting on a command + gSessionData->mWaitingOnCommand = false; + + if (response < 0) { + logg->logError(__FILE__, __LINE__, "Target error: Unexpected socket disconnect"); + handleException(); + } + + const char type = header[0]; + const int length = (header[1] << 0) | (header[2] << 8) | (header[3] << 16) | (header[4] << 24); + + // add artificial limit + if ((length < 0) || length > 1024 * 1024) { + logg->logError(__FILE__, __LINE__, "Target error: Invalid length received, %d", length); + handleException(); + } + + // allocate memory to contain the xml file, size of zero returns a zero size object + data = (char*)calloc(length + 1, 1); + if (data == NULL) { + logg->logError(__FILE__, __LINE__, "Unable to allocate memory for xml"); + handleException(); + } + + // receive data + response = mSocket->receiveNBytes(data, length); + if (response < 0) { + logg->logError(__FILE__, __LINE__, "Target error: Unexpected socket disconnect"); + handleException(); + } + + // null terminate the data for string parsing + if (length > 0) { + data[length] = 0; + } + + *command = type; + return data; +} + +void StreamlineSetup::handleRequest(char* xml) { + mxml_node_t *tree, *node; + const char * attr = NULL; + + tree = mxmlLoadString(NULL, xml, MXML_NO_CALLBACK); + node = mxmlFindElement(tree, tree, TAG_REQUEST, ATTR_TYPE, NULL, MXML_DESCEND_FIRST); + if (node) { + attr = mxmlElementGetAttr(node, ATTR_TYPE); + } + if (attr && strcmp(attr, VALUE_EVENTS) == 0) { + sendEvents(); + logg->logMessage("Sent events xml response"); + } else if (attr && strcmp(attr, VALUE_CONFIGURATION) == 0) { + sendConfiguration(); + logg->logMessage("Sent configuration xml response"); + } else if (attr && strcmp(attr, VALUE_COUNTERS) == 0) { + sendCounters(); + logg->logMessage("Sent counters xml response"); + } else if (attr && strcmp(attr, VALUE_CAPTURED) == 0) { + CapturedXML capturedXML; + char* capturedText = capturedXML.getXML(false); + sendData(capturedText, strlen(capturedText), RESPONSE_XML); + free(capturedText); + logg->logMessage("Sent captured xml response"); + } else if (attr && strcmp(attr, VALUE_DEFAULTS) == 0) { + sendDefaults(); + logg->logMessage("Sent default configuration xml response"); + } else { + char error[] = "Unknown request"; + sendData(error, strlen(error), RESPONSE_NAK); + logg->logMessage("Received unknown request:\n%s", xml); + } + + mxmlDelete(tree); +} + +void StreamlineSetup::handleDeliver(char* xml) { + mxml_node_t *tree; + + // Determine xml type + tree = mxmlLoadString(NULL, xml, MXML_NO_CALLBACK); + if (mxmlFindElement(tree, tree, TAG_SESSION, NULL, NULL, MXML_DESCEND_FIRST)) { + // Session XML + gSessionData->parseSessionXML(xml); + sendData(NULL, 0, RESPONSE_ACK); + logg->logMessage("Received session xml"); + } else if (mxmlFindElement(tree, tree, TAG_CONFIGURATIONS, NULL, NULL, MXML_DESCEND_FIRST)) { + // Configuration XML + writeConfiguration(xml); + sendData(NULL, 0, RESPONSE_ACK); + logg->logMessage("Received configuration xml"); + } else { + // Unknown XML + logg->logMessage("Received unknown XML delivery type"); + sendData(NULL, 0, RESPONSE_NAK); + } + + mxmlDelete(tree); +} + +void StreamlineSetup::sendData(const char* data, uint32_t length, char type) { + unsigned char header[5]; + header[0] = type; + Buffer::writeLEInt(header + 1, length); + mSocket->send((char*)&header, sizeof(header)); + mSocket->send((const char*)data, length); +} + +void StreamlineSetup::sendEvents() { + EventsXML eventsXML; + char* string = eventsXML.getXML(); + sendString(string, RESPONSE_XML); + free(string); +} + +void StreamlineSetup::sendConfiguration() { + ConfigurationXML xml; + + const char* string = xml.getConfigurationXML(); + sendData(string, strlen(string), RESPONSE_XML); +} + +void StreamlineSetup::sendDefaults() { + // Send the config built into the binary + const char* xml; + unsigned int size; + ConfigurationXML::getDefaultConfigurationXml(xml, size); + + // Artificial size restriction + if (size > 1024*1024) { + logg->logError(__FILE__, __LINE__, "Corrupt default configuration file"); + handleException(); + } + + sendData(xml, size, RESPONSE_XML); +} + +void StreamlineSetup::sendCounters() { + mxml_node_t *xml; + mxml_node_t *counters; + + xml = mxmlNewXML("1.0"); + counters = mxmlNewElement(xml, "counters"); + int count = 0; + for (Driver *driver = Driver::getHead(); driver != NULL; driver = driver->getNext()) { + count += driver->writeCounters(counters); + } + + if (count == 0) { + logg->logError(__FILE__, __LINE__, "No counters found, this could be because /dev/gator/events can not be read or because perf is not working correctly"); + handleException(); + } + + char* string = mxmlSaveAllocString(xml, mxmlWhitespaceCB); + sendString(string, RESPONSE_XML); + + free(string); + mxmlDelete(xml); +} + +void StreamlineSetup::writeConfiguration(char* xml) { + char path[PATH_MAX]; + + ConfigurationXML::getPath(path); + + if (util->writeToDisk(path, xml) < 0) { + logg->logError(__FILE__, __LINE__, "Error writing %s\nPlease verify write permissions to this path.", path); + handleException(); + } + + // Re-populate gSessionData with the configuration, as it has now changed + { ConfigurationXML configuration; } + + if (gSessionData->mCounterOverflow > 0) { + logg->logError(__FILE__, __LINE__, "Only %i performance counters are permitted, %i are selected", MAX_PERFORMANCE_COUNTERS, gSessionData->mCounterOverflow); + handleException(); + } +} diff --git a/tools/gator/daemon/StreamlineSetup.h b/tools/gator/daemon/StreamlineSetup.h new file mode 100644 index 00000000..623e14f2 --- /dev/null +++ b/tools/gator/daemon/StreamlineSetup.h @@ -0,0 +1,50 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __STREAMLINE_SETUP_H__ +#define __STREAMLINE_SETUP_H__ + +#include +#include + +class OlySocket; + +// Commands from Streamline +enum { + COMMAND_REQUEST_XML = 0, + COMMAND_DELIVER_XML = 1, + COMMAND_APC_START = 2, + COMMAND_APC_STOP = 3, + COMMAND_DISCONNECT = 4, + COMMAND_PING = 5 +}; + +class StreamlineSetup { +public: + StreamlineSetup(OlySocket *socket); + ~StreamlineSetup(); +private: + OlySocket* mSocket; + + char* readCommand(int*); + void handleRequest(char* xml); + void handleDeliver(char* xml); + void sendData(const char* data, uint32_t length, char type); + void sendString(const char* string, int type) {sendData(string, strlen(string), type);} + void sendEvents(); + void sendConfiguration(); + void sendDefaults(); + void sendCounters(); + void writeConfiguration(char* xml); + + // Intentionally unimplemented + StreamlineSetup(const StreamlineSetup &); + StreamlineSetup &operator=(const StreamlineSetup &); +}; + +#endif //__STREAMLINE_SETUP_H__ diff --git a/tools/gator/daemon/UEvent.cpp b/tools/gator/daemon/UEvent.cpp new file mode 100644 index 00000000..f94a9953 --- /dev/null +++ b/tools/gator/daemon/UEvent.cpp @@ -0,0 +1,77 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "UEvent.h" + +#include +#include +#include + +#include + +#include "Logging.h" +#include "OlySocket.h" + +static const char EMPTY[] = ""; +static const char ACTION[] = "ACTION="; +static const char DEVPATH[] = "DEVPATH="; +static const char SUBSYSTEM[] = "SUBSYSTEM="; + +UEvent::UEvent() : mFd(-1) { +} + +UEvent::~UEvent() { + if (mFd >= 0) { + close(mFd); + } +} + +bool UEvent::init() { + mFd = socket_cloexec(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT); + if (mFd < 0) { + logg->logMessage("%s(%s:%i): socket failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + struct sockaddr_nl sockaddr; + memset(&sockaddr, 0, sizeof(sockaddr)); + sockaddr.nl_family = AF_NETLINK; + sockaddr.nl_groups = 1; // bitmask: (1 << 0) == kernel events, (1 << 1) == udev events + sockaddr.nl_pid = 0; + if (bind(mFd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) != 0) { + logg->logMessage("%s(%s:%i): bind failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + return true; +} + +bool UEvent::read(UEventResult *const result) { + ssize_t bytes = recv(mFd, result->mBuf, sizeof(result->mBuf), 0); + if (bytes <= 0) { + logg->logMessage("%s(%s:%i): recv failed", __FUNCTION__, __FILE__, __LINE__); + return false; + } + + result->mAction = EMPTY; + result->mDevPath = EMPTY; + result->mSubsystem = EMPTY; + + for (int pos = 0; pos < bytes; pos += strlen(result->mBuf + pos) + 1) { + char *const str = result->mBuf + pos; + if (strncmp(str, ACTION, sizeof(ACTION) - 1) == 0) { + result->mAction = str + sizeof(ACTION) - 1; + } else if (strncmp(str, DEVPATH, sizeof(DEVPATH) - 1) == 0) { + result->mDevPath = str + sizeof(DEVPATH) - 1; + } else if (strncmp(str, SUBSYSTEM, sizeof(SUBSYSTEM) - 1) == 0) { + result->mSubsystem = str + sizeof(SUBSYSTEM) - 1; + } + } + + return true; +} diff --git a/tools/gator/daemon/UEvent.h b/tools/gator/daemon/UEvent.h new file mode 100644 index 00000000..2f7ef2c9 --- /dev/null +++ b/tools/gator/daemon/UEvent.h @@ -0,0 +1,36 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef UEVENT_H +#define UEVENT_H + +struct UEventResult { + const char *mAction; + const char *mDevPath; + const char *mSubsystem; + char mBuf[1<<13]; +}; + +class UEvent { +public: + UEvent(); + ~UEvent(); + + bool init(); + bool read(UEventResult *const result); + int getFd() const { return mFd; } + +private: + int mFd; + + // Intentionally undefined + UEvent(const UEvent &); + UEvent &operator=(const UEvent &); +}; + +#endif // UEVENT_H diff --git a/tools/gator/daemon/UserSpaceSource.cpp b/tools/gator/daemon/UserSpaceSource.cpp new file mode 100644 index 00000000..4a9b22f4 --- /dev/null +++ b/tools/gator/daemon/UserSpaceSource.cpp @@ -0,0 +1,94 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "UserSpaceSource.h" + +#include +#include + +#include "Child.h" +#include "DriverSource.h" +#include "Logging.h" +#include "SessionData.h" + +extern Child *child; + +UserSpaceSource::UserSpaceSource(sem_t *senderSem) : mBuffer(0, FRAME_BLOCK_COUNTER, gSessionData->mTotalBufferSize*1024*1024, senderSem) { +} + +UserSpaceSource::~UserSpaceSource() { +} + +bool UserSpaceSource::prepare() { + return true; +} + +void UserSpaceSource::run() { + prctl(PR_SET_NAME, (unsigned long)&"gatord-counters", 0, 0, 0); + + for (int i = 0; i < ARRAY_LENGTH(gSessionData->usDrivers); ++i) { + gSessionData->usDrivers[i]->start(); + } + + int64_t monotonic_started = 0; + while (monotonic_started <= 0) { + usleep(10); + + if (gSessionData->perf.isSetup()) { + monotonic_started = gSessionData->mMonotonicStarted; + } else { + if (DriverSource::readInt64Driver("/dev/gator/started", &monotonic_started) == -1) { + logg->logError(__FILE__, __LINE__, "Error reading gator driver start time"); + handleException(); + } + gSessionData->mMonotonicStarted = monotonic_started; + } + } + + uint64_t next_time = 0; + while (gSessionData->mSessionIsActive) { + const uint64_t curr_time = getTime() - monotonic_started; + // Sample ten times a second ignoring gSessionData->mSampleRate + next_time += NS_PER_S/10;//gSessionData->mSampleRate; + if (next_time < curr_time) { + logg->logMessage("Too slow, curr_time: %lli next_time: %lli", curr_time, next_time); + next_time = curr_time; + } + + if (mBuffer.eventHeader(curr_time)) { + for (int i = 0; i < ARRAY_LENGTH(gSessionData->usDrivers); ++i) { + gSessionData->usDrivers[i]->read(&mBuffer); + } + // Only check after writing all counters so that time and corresponding counters appear in the same frame + mBuffer.check(curr_time); + } + + if (mBuffer.bytesAvailable() <= 0) { + logg->logMessage("One shot (counters)"); + child->endSession(); + } + + usleep((next_time - curr_time)/NS_PER_US); + } + + mBuffer.setDone(); +} + +void UserSpaceSource::interrupt() { + // Do nothing +} + +bool UserSpaceSource::isDone() { + return mBuffer.isDone(); +} + +void UserSpaceSource::write(Sender *sender) { + if (!mBuffer.isDone()) { + mBuffer.write(sender); + } +} diff --git a/tools/gator/daemon/UserSpaceSource.h b/tools/gator/daemon/UserSpaceSource.h new file mode 100644 index 00000000..9b366601 --- /dev/null +++ b/tools/gator/daemon/UserSpaceSource.h @@ -0,0 +1,38 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef USERSPACESOURCE_H +#define USERSPACESOURCE_H + +#include + +#include "Buffer.h" +#include "Source.h" + +// User space counters +class UserSpaceSource : public Source { +public: + UserSpaceSource(sem_t *senderSem); + ~UserSpaceSource(); + + bool prepare(); + void run(); + void interrupt(); + + bool isDone(); + void write(Sender *sender); + +private: + Buffer mBuffer; + + // Intentionally unimplemented + UserSpaceSource(const UserSpaceSource &); + UserSpaceSource &operator=(const UserSpaceSource &); +}; + +#endif // USERSPACESOURCE_H diff --git a/tools/gator/daemon/c++.cpp b/tools/gator/daemon/c++.cpp new file mode 100644 index 00000000..6041e5e9 --- /dev/null +++ b/tools/gator/daemon/c++.cpp @@ -0,0 +1,40 @@ +/** + * Minimal set of C++ functions so that libstdc++ is not required + * + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include + +void operator delete(void *ptr) { + if (ptr != NULL) { + free(ptr); + } +} + +void operator delete[](void *ptr) { + operator delete(ptr); +} + +void *operator new(size_t size) { + void *ptr = malloc(size == 0 ? 1 : size); + if (ptr == NULL) { + abort(); + } + return ptr; +} + +void *operator new[](size_t size) { + return operator new(size); +} + +extern "C" +void __cxa_pure_virtual() { + printf("pure virtual method called\n"); + abort(); +} diff --git a/tools/gator/daemon/common.mk b/tools/gator/daemon/common.mk new file mode 100644 index 00000000..769a92e5 --- /dev/null +++ b/tools/gator/daemon/common.mk @@ -0,0 +1,52 @@ +# -g produces debugging information +# -O3 maximum optimization +# -O0 no optimization, used for debugging +# -Wall enables most warnings +# -Werror treats warnings as errors +# -std=c++0x is the planned new c++ standard +# -std=c++98 is the 1998 c++ standard +CPPFLAGS += -O3 -Wall -fno-exceptions -pthread -MMD -DETCDIR=\"/etc\" -Ilibsensors +CXXFLAGS += -fno-rtti -Wextra # -Weffc++ +ifeq ($(WERROR),1) + CPPFLAGS += -Werror +endif +# -s strips the binary of debug info +LDFLAGS += -s +LDLIBS += -lrt -lm -pthread +TARGET = gatord +C_SRC = $(wildcard mxml/*.c) $(wildcard libsensors/*.c) +CXX_SRC = $(wildcard *.cpp) + +all: $(TARGET) + +events.xml: events_header.xml $(wildcard events-*.xml) events_footer.xml + cat $^ > $@ + +include $(wildcard *.d) +include $(wildcard mxml/*.d) + +EventsXML.cpp: events_xml.h +ConfigurationXML.cpp: defaults_xml.h + +# Don't regenerate conf-lex.c or conf-parse.c +libsensors/conf-lex.c: ; +libsensors/conf-parse.c: ; + +%_xml.h: %.xml escape + ./escape $< > $@ + +%.o: %.c + $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< + +%.o: %.cpp + $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $< + +$(TARGET): $(CXX_SRC:%.cpp=%.o) $(C_SRC:%.c=%.o) + $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ + +# Intentionally ignore CC as a native binary is required +escape: escape.c + gcc $^ -o $@ + +clean: + rm -f *.d *.o mxml/*.d mxml/*.o libsensors/*.d libsensors/*.o $(TARGET) escape events.xml events_xml.h defaults_xml.h diff --git a/tools/gator/daemon/defaults.xml b/tools/gator/daemon/defaults.xml new file mode 100644 index 00000000..086eca1e --- /dev/null +++ b/tools/gator/daemon/defaults.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/defaults_xml.h b/tools/gator/daemon/defaults_xml.h new file mode 100644 index 00000000..5e999fe2 --- /dev/null +++ b/tools/gator/daemon/defaults_xml.h @@ -0,0 +1,407 @@ +static const unsigned char defaults_xml[] = { + 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, + 0x3f, 0x3e, 0x0a, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x33, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x5f, 0x63, 0x63, 0x6e, + 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x66, 0x66, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x41, 0x52, 0x4d, 0x31, 0x31, 0x5f, 0x63, 0x6e, 0x74, 0x30, 0x22, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x31, + 0x31, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x62, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x4d, 0x50, 0x43, + 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x31, 0x31, + 0x4d, 0x50, 0x43, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x30, 0x22, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x41, 0x52, + 0x4d, 0x31, 0x31, 0x4d, 0x50, 0x43, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6e, + 0x74, 0x31, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x62, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x35, + 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, + 0x5f, 0x41, 0x35, 0x5f, 0x63, 0x6e, 0x74, 0x30, 0x22, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, + 0x65, 0x78, 0x5f, 0x41, 0x35, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x22, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, + 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x37, 0x5f, 0x63, 0x63, 0x6e, 0x74, + 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, + 0x66, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, + 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x37, 0x5f, 0x63, + 0x6e, 0x74, 0x30, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, + 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, + 0x78, 0x5f, 0x41, 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x32, 0x22, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, + 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x38, 0x5f, 0x63, 0x63, 0x6e, 0x74, + 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, + 0x66, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, + 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x38, 0x5f, 0x63, + 0x6e, 0x74, 0x30, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x38, + 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x34, 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, + 0x5f, 0x41, 0x38, 0x5f, 0x63, 0x6e, 0x74, 0x32, 0x22, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x33, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, + 0x74, 0x65, 0x78, 0x5f, 0x41, 0x38, 0x5f, 0x63, 0x6e, 0x74, 0x33, 0x22, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, + 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x39, 0x5f, 0x63, 0x63, + 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x66, 0x66, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x39, + 0x5f, 0x63, 0x6e, 0x74, 0x30, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x36, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, + 0x5f, 0x41, 0x39, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x22, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x36, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, + 0x74, 0x65, 0x78, 0x5f, 0x41, 0x39, 0x5f, 0x63, 0x6e, 0x74, 0x32, 0x22, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x37, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, + 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x39, 0x5f, 0x63, 0x6e, + 0x74, 0x33, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x39, + 0x5f, 0x63, 0x6e, 0x74, 0x34, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, + 0x5f, 0x41, 0x31, 0x35, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, + 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x31, 0x35, 0x5f, 0x63, 0x6e, 0x74, + 0x30, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, + 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x31, 0x35, 0x5f, + 0x63, 0x6e, 0x74, 0x31, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, + 0x41, 0x31, 0x35, 0x5f, 0x63, 0x6e, 0x74, 0x32, 0x22, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, + 0x74, 0x65, 0x78, 0x5f, 0x41, 0x31, 0x35, 0x5f, 0x63, 0x6e, 0x74, 0x33, + 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x39, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, + 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x31, 0x37, 0x5f, + 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, + 0x41, 0x31, 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x30, 0x22, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, + 0x74, 0x65, 0x78, 0x5f, 0x41, 0x31, 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x31, + 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, + 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x31, 0x37, 0x5f, + 0x63, 0x6e, 0x74, 0x32, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, + 0x41, 0x31, 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x33, 0x22, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x39, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, + 0x78, 0x2d, 0x41, 0x35, 0x33, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x31, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x43, 0x6f, 0x72, + 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x33, 0x5f, 0x63, 0x6e, 0x74, 0x30, + 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x43, 0x6f, + 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x33, 0x5f, 0x63, 0x6e, 0x74, + 0x31, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x33, 0x5f, 0x63, + 0x6e, 0x74, 0x32, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x33, + 0x5f, 0x63, 0x6e, 0x74, 0x33, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x39, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, + 0x35, 0x37, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x31, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, + 0x2d, 0x41, 0x35, 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x30, 0x22, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, + 0x78, 0x2d, 0x41, 0x35, 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x22, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x43, 0x6f, 0x72, + 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x32, + 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x43, + 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x37, 0x5f, 0x63, 0x6e, + 0x74, 0x33, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x39, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x30, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6e, + 0x74, 0x31, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x4d, 0x50, 0x5f, 0x63, 0x63, 0x6e, 0x74, + 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, + 0x66, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x4d, 0x50, 0x5f, 0x63, 0x6e, 0x74, 0x30, 0x22, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x4d, 0x50, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x22, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x4b, 0x72, 0x61, 0x69, 0x74, 0x5f, 0x63, 0x63, 0x6e, + 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x66, 0x66, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4b, 0x72, 0x61, 0x69, + 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x30, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x4b, 0x72, 0x61, 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x22, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x71, 0x5f, 0x77, 0x72, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x71, 0x5f, 0x72, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x6d, 0x65, + 0x6d, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x6d, 0x75, 0x73, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, + 0x5f, 0x6d, 0x65, 0x6d, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x6d, + 0x75, 0x73, 0x65, 0x64, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, + 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x69, 0x6e, 0x66, 0x6f, + 0x5f, 0x6d, 0x65, 0x6d, 0x66, 0x72, 0x65, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x74, + 0x65, 0x78, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, + 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x22, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x31, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x63, 0x6c, 0x22, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, + 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x47, 0x50, 0x55, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4a, 0x53, 0x31, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x4a, 0x53, 0x32, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x47, 0x50, 0x55, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x31, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x32, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x47, 0x50, 0x55, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x31, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x32, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x47, 0x50, 0x55, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x36, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4a, 0x53, 0x31, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x36, 0x78, 0x5f, 0x4a, 0x53, 0x32, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x32, 0x43, 0x2d, 0x33, + 0x31, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x30, 0x22, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x3c, + 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x3e, 0x0a, 0x00 +}; +static const unsigned int defaults_xml_len = 4841; diff --git a/tools/gator/daemon/escape b/tools/gator/daemon/escape new file mode 100755 index 00000000..99f38e84 Binary files /dev/null and b/tools/gator/daemon/escape differ diff --git a/tools/gator/daemon/escape.c b/tools/gator/daemon/escape.c new file mode 100644 index 00000000..2b0863aa --- /dev/null +++ b/tools/gator/daemon/escape.c @@ -0,0 +1,75 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* + * The Makefile in the daemon folder builds and executes 'escape' + * 'escape' creates configuration_xml.h from configuration.xml and events_xml.h from events-*.xml + * these genereated xml files are then #included and built as part of the gatord binary + */ + +#include +#include +#include +#include +#include + +static void print_escaped_path(char *path) { + if (isdigit(*path)) { + printf("__"); + } + for (; *path != '\0'; ++path) { + printf("%c", isalnum(*path) ? *path : '_'); + } +} + +int main(int argc, char *argv[]) { + int i; + char *path; + FILE *in = NULL; + int ch; + unsigned int len = 0; + + for (i = 1; i < argc && argv[i][0] == '-'; ++i) ; + if (i == argc) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return EXIT_FAILURE; + } + path = argv[i]; + + errno = 0; + if ((in = fopen(path, "r")) == NULL) { + fprintf(stderr, "Unable to open '%s': %s\n", path, strerror(errno)); + return EXIT_FAILURE; + } + + printf("static const unsigned char "); + print_escaped_path(path); + printf("[] = {"); + for (;;) { + ch = fgetc(in); + if (len != 0) { + printf(","); + } + if (len % 12 == 0) { + printf("\n "); + } + // Write out a null character after the contents of the file but do not increment len + printf(" 0x%.2x", (ch == EOF ? 0 : ch)); + if (ch == EOF) { + break; + } + ++len; + } + printf("\n};\nstatic const unsigned int "); + print_escaped_path(path); + printf("_len = %i;\n", len); + + fclose(in); + + return EXIT_SUCCESS; +} diff --git a/tools/gator/daemon/events-ARM11.xml b/tools/gator/daemon/events-ARM11.xml new file mode 100644 index 00000000..57e32354 --- /dev/null +++ b/tools/gator/daemon/events-ARM11.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-ARM11MPCore.xml b/tools/gator/daemon/events-ARM11MPCore.xml new file mode 100644 index 00000000..2d5c5e19 --- /dev/null +++ b/tools/gator/daemon/events-ARM11MPCore.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-CCI-400.xml b/tools/gator/daemon/events-CCI-400.xml new file mode 100644 index 00000000..20002efd --- /dev/null +++ b/tools/gator/daemon/events-CCI-400.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-CCN-504.xml b/tools/gator/daemon/events-CCN-504.xml new file mode 100644 index 00000000..6ef3e648 --- /dev/null +++ b/tools/gator/daemon/events-CCN-504.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Cortex-A15.xml b/tools/gator/daemon/events-Cortex-A15.xml new file mode 100644 index 00000000..f50e55d6 --- /dev/null +++ b/tools/gator/daemon/events-Cortex-A15.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Cortex-A17.xml b/tools/gator/daemon/events-Cortex-A17.xml new file mode 100644 index 00000000..4dd08c1f --- /dev/null +++ b/tools/gator/daemon/events-Cortex-A17.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Cortex-A5.xml b/tools/gator/daemon/events-Cortex-A5.xml new file mode 100644 index 00000000..d67581d7 --- /dev/null +++ b/tools/gator/daemon/events-Cortex-A5.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Cortex-A53.xml b/tools/gator/daemon/events-Cortex-A53.xml new file mode 100644 index 00000000..5ba17907 --- /dev/null +++ b/tools/gator/daemon/events-Cortex-A53.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Cortex-A57.xml b/tools/gator/daemon/events-Cortex-A57.xml new file mode 100644 index 00000000..fbe96c2d --- /dev/null +++ b/tools/gator/daemon/events-Cortex-A57.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Cortex-A7.xml b/tools/gator/daemon/events-Cortex-A7.xml new file mode 100644 index 00000000..6e078b3c --- /dev/null +++ b/tools/gator/daemon/events-Cortex-A7.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Cortex-A8.xml b/tools/gator/daemon/events-Cortex-A8.xml new file mode 100644 index 00000000..a69e25ab --- /dev/null +++ b/tools/gator/daemon/events-Cortex-A8.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Cortex-A9.xml b/tools/gator/daemon/events-Cortex-A9.xml new file mode 100644 index 00000000..3e7f8289 --- /dev/null +++ b/tools/gator/daemon/events-Cortex-A9.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Filesystem.xml b/tools/gator/daemon/events-Filesystem.xml new file mode 100644 index 00000000..9ef61dda --- /dev/null +++ b/tools/gator/daemon/events-Filesystem.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/tools/gator/daemon/events-Krait-architected.xml b/tools/gator/daemon/events-Krait-architected.xml new file mode 100644 index 00000000..b8d3bcb4 --- /dev/null +++ b/tools/gator/daemon/events-Krait-architected.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-L2C-310.xml b/tools/gator/daemon/events-L2C-310.xml new file mode 100644 index 00000000..923fb903 --- /dev/null +++ b/tools/gator/daemon/events-L2C-310.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Linux.xml b/tools/gator/daemon/events-Linux.xml new file mode 100644 index 00000000..62a7018d --- /dev/null +++ b/tools/gator/daemon/events-Linux.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Mali-4xx.xml b/tools/gator/daemon/events-Mali-4xx.xml new file mode 100644 index 00000000..0a95dfeb --- /dev/null +++ b/tools/gator/daemon/events-Mali-4xx.xml @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Mali-Midgard.xml b/tools/gator/daemon/events-Mali-Midgard.xml new file mode 100644 index 00000000..b6ab4b88 --- /dev/null +++ b/tools/gator/daemon/events-Mali-Midgard.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Mali-Midgard_hw.xml b/tools/gator/daemon/events-Mali-Midgard_hw.xml new file mode 100644 index 00000000..4f3323f1 --- /dev/null +++ b/tools/gator/daemon/events-Mali-Midgard_hw.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Mali-T60x_hw.xml b/tools/gator/daemon/events-Mali-T60x_hw.xml new file mode 100644 index 00000000..50797e64 --- /dev/null +++ b/tools/gator/daemon/events-Mali-T60x_hw.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Mali-T62x_hw.xml b/tools/gator/daemon/events-Mali-T62x_hw.xml new file mode 100644 index 00000000..6ecc53c2 --- /dev/null +++ b/tools/gator/daemon/events-Mali-T62x_hw.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Mali-T72x_hw.xml b/tools/gator/daemon/events-Mali-T72x_hw.xml new file mode 100644 index 00000000..55875347 --- /dev/null +++ b/tools/gator/daemon/events-Mali-T72x_hw.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Mali-T76x_hw.xml b/tools/gator/daemon/events-Mali-T76x_hw.xml new file mode 100644 index 00000000..be74c5a4 --- /dev/null +++ b/tools/gator/daemon/events-Mali-T76x_hw.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Mali-V500.xml b/tools/gator/daemon/events-Mali-V500.xml new file mode 100644 index 00000000..89bc7f47 --- /dev/null +++ b/tools/gator/daemon/events-Mali-V500.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Perf-Hardware.xml b/tools/gator/daemon/events-Perf-Hardware.xml new file mode 100644 index 00000000..423696f8 --- /dev/null +++ b/tools/gator/daemon/events-Perf-Hardware.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-Scorpion.xml b/tools/gator/daemon/events-Scorpion.xml new file mode 100644 index 00000000..fa716fdc --- /dev/null +++ b/tools/gator/daemon/events-Scorpion.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-ScorpionMP.xml b/tools/gator/daemon/events-ScorpionMP.xml new file mode 100644 index 00000000..c648ccef --- /dev/null +++ b/tools/gator/daemon/events-ScorpionMP.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events-ftrace.xml b/tools/gator/daemon/events-ftrace.xml new file mode 100644 index 00000000..33ab7aab --- /dev/null +++ b/tools/gator/daemon/events-ftrace.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/tools/gator/daemon/events.xml b/tools/gator/daemon/events.xml new file mode 100644 index 00000000..deeea8a0 --- /dev/null +++ b/tools/gator/daemon/events.xml @@ -0,0 +1,1919 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gator/daemon/events_footer.xml b/tools/gator/daemon/events_footer.xml new file mode 100644 index 00000000..cd2b4466 --- /dev/null +++ b/tools/gator/daemon/events_footer.xml @@ -0,0 +1 @@ + diff --git a/tools/gator/daemon/events_header.xml b/tools/gator/daemon/events_header.xml new file mode 100644 index 00000000..38ec4c03 --- /dev/null +++ b/tools/gator/daemon/events_header.xml @@ -0,0 +1,2 @@ + + diff --git a/tools/gator/daemon/events_xml.h b/tools/gator/daemon/events_xml.h new file mode 100644 index 00000000..2a9c288d --- /dev/null +++ b/tools/gator/daemon/events_xml.h @@ -0,0 +1,20025 @@ +static const unsigned char events_xml[] = { + 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, + 0x3f, 0x3e, 0x0a, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, + 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x4d, 0x50, 0x43, 0x6f, 0x72, 0x65, + 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, + 0x22, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x31, 0x31, 0x4d, 0x50, 0x43, 0x6f, 0x72, 0x65, 0x22, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x4d, + 0x50, 0x43, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, + 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x4d, 0x50, 0x43, 0x6f, 0x72, + 0x65, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x68, 0x65, + 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, + 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x61, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x63, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x64, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x54, 0x4c, 0x42, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x28, 0x75, 0x6e, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, + 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x20, + 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x54, 0x4c, 0x42, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x28, 0x75, 0x6e, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, + 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6d, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, + 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x20, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x36, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4e, + 0x6f, 0x74, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6d, 0x69, + 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x72, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x72, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x6f, 0x6c, 0x64, + 0x65, 0x64, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x2c, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x64, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x65, + 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x43, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x20, 0x77, 0x2f, 0x6f, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, + 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x43, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, + 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x69, 0x6e, 0x20, 0x54, 0x4c, + 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x31, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x28, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x2c, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x62, 0x61, 0x63, + 0x6b, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x74, + 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x20, 0x62, 0x65, 0x69, + 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x33, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, + 0x77, 0x61, 0x73, 0x20, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4c, + 0x53, 0x55, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, + 0x6f, 0x72, 0x20, 0x43, 0x50, 0x31, 0x35, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x53, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x6c, 0x79, 0x20, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x6c, 0x6f, 0x74, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x46, 0x46, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x72, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, + 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x41, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x5f, + 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, + 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x31, 0x31, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x41, + 0x52, 0x4d, 0x31, 0x31, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, 0x65, + 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, + 0x63, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3d, 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, + 0x69, 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, + 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, + 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x73, 0x20, 0x61, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x64, + 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x20, 0x54, 0x4c, + 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x69, 0x63, + 0x72, 0x6f, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x28, + 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x52, + 0x4d, 0x31, 0x31, 0x35, 0x36, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, + 0x69, 0x63, 0x72, 0x6f, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x4d, 0x69, 0x63, + 0x72, 0x6f, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x28, + 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x52, + 0x4d, 0x31, 0x31, 0x35, 0x36, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x62, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x64, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6c, + 0x6f, 0x77, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, + 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x20, 0x6d, 0x69, 0x73, 0x2d, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x62, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x2d, 0x62, 0x61, 0x63, 0x6b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x2d, 0x62, 0x61, 0x63, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x64, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x57, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, + 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x50, 0x43, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x69, 0x6e, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x20, 0x28, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, 0x29, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x45, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x20, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, + 0x72, 0x20, 0x70, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x31, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x55, + 0x6e, 0x69, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, + 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, + 0x72, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x65, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x53, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x61, 0x72, 0x72, 0x69, + 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x6f, + 0x72, 0x20, 0x53, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x6c, 0x79, 0x20, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x49, 0x51, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x46, 0x49, 0x51, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, + 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x28, 0x41, 0x52, 0x4d, 0x31, 0x31, + 0x35, 0x36, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x29, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x34, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x52, 0x51, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x49, 0x52, 0x51, 0x20, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, + 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x28, 0x41, + 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x29, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x32, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, + 0x54, 0x4d, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x54, + 0x4d, 0x45, 0x58, 0x54, 0x4f, 0x55, 0x54, 0x5b, 0x30, 0x5d, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x45, 0x54, 0x4d, 0x45, 0x58, 0x54, 0x4f, 0x55, 0x54, 0x5b, 0x30, + 0x5d, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x31, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x54, 0x4d, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x54, 0x4d, 0x45, 0x58, + 0x54, 0x4f, 0x55, 0x54, 0x5b, 0x31, 0x5d, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x54, + 0x4d, 0x45, 0x58, 0x54, 0x4f, 0x55, 0x54, 0x5b, 0x31, 0x5d, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x32, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x54, 0x4d, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x54, 0x4d, 0x45, 0x58, 0x54, 0x4f, 0x55, + 0x54, 0x5b, 0x30, 0x2c, 0x31, 0x5d, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x54, 0x4d, + 0x45, 0x58, 0x54, 0x4f, 0x55, 0x54, 0x5b, 0x30, 0x5d, 0x20, 0x6f, 0x72, + 0x20, 0x45, 0x54, 0x4d, 0x45, 0x58, 0x54, 0x4f, 0x55, 0x54, 0x5b, 0x31, + 0x5d, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x32, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x32, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x32, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x64, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x32, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x64, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x6c, + 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x33, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x61, 0x67, 0x20, 0x6f, 0x72, + 0x20, 0x70, 0x61, 0x72, 0x69, 0x74, 0x79, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x54, 0x61, + 0x67, 0x20, 0x6f, 0x72, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x52, + 0x41, 0x4d, 0x20, 0x70, 0x61, 0x72, 0x69, 0x74, 0x79, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x28, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, + 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x31, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x72, 0x69, 0x74, 0x79, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x52, 0x41, 0x4d, 0x20, + 0x70, 0x61, 0x72, 0x69, 0x74, 0x79, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x28, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x33, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x74, 0x61, 0x67, 0x20, + 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x69, 0x74, 0x79, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x54, 0x61, 0x67, 0x20, 0x6f, 0x72, 0x20, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x52, 0x41, 0x4d, 0x20, 0x70, 0x61, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, + 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, 0x20, 0x6f, 0x6e, 0x6c, 0x79, + 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x33, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x70, 0x61, 0x72, 0x69, 0x74, 0x79, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x52, 0x41, 0x4d, 0x20, + 0x70, 0x61, 0x72, 0x69, 0x74, 0x79, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x28, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x33, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x49, 0x54, 0x43, 0x4d, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x54, + 0x43, 0x4d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x41, 0x52, + 0x4d, 0x31, 0x31, 0x35, 0x36, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x29, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, + 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x54, + 0x43, 0x4d, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x54, 0x43, 0x4d, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, + 0x36, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x36, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, + 0x75, 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x20, 0x70, 0x6f, 0x70, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x70, 0x6f, 0x70, + 0x70, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x20, 0x28, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x33, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x69, + 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x70, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x6f, 0x66, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, + 0x65, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, + 0x74, 0x6c, 0x79, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x46, 0x55, + 0x20, 0x28, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x33, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x64, 0x69, 0x72, 0x74, + 0x79, 0x20, 0x70, 0x61, 0x72, 0x69, 0x74, 0x79, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x44, 0x69, 0x72, 0x74, 0x79, 0x20, 0x52, 0x41, + 0x4d, 0x20, 0x70, 0x61, 0x72, 0x69, 0x74, 0x79, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x28, 0x41, 0x52, 0x4d, 0x31, 0x31, 0x35, 0x36, 0x20, + 0x6f, 0x6e, 0x6c, 0x79, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, + 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x5f, + 0x34, 0x30, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x3d, 0x22, 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x43, 0x43, 0x49, 0x5f, 0x34, 0x30, 0x30, 0x5f, 0x63, 0x6e, 0x74, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, + 0x6f, 0x22, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x43, 0x43, 0x49, 0x5f, 0x34, 0x30, 0x30, 0x5f, 0x63, 0x63, 0x6e, 0x74, + 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, + 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x2d, 0x34, 0x30, 0x30, 0x20, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, + 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, + 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x72, + 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, + 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x30, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x31, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x66, 0x61, 0x63, 0x65, 0x20, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, + 0x22, 0x30, 0x78, 0x34, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x53, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x32, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x33, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, + 0x63, 0x65, 0x20, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, + 0x78, 0x38, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, + 0x34, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x34, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, + 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x61, 0x6e, 0x79, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, + 0x61, 0x6e, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, + 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, + 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x3a, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, + 0x3a, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x2c, 0x20, 0x6e, 0x6f, + 0x6e, 0x2d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x6f, 0x72, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2d, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, + 0x20, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x61, + 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, + 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, + 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x2d, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x2d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x2c, + 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x61, 0x72, + 0x72, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x44, 0x56, 0x4d, 0x20, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, + 0x63, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, + 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, + 0x64, 0x3a, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2c, 0x20, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x49, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x2c, 0x20, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x53, + 0x68, 0x61, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, + 0x3a, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x62, 0x61, 0x72, + 0x72, 0x69, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x36, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, + 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, + 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x73, 0x79, + 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x37, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, + 0x44, 0x56, 0x4d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, + 0x20, 0x6e, 0x6f, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x44, + 0x56, 0x4d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x44, 0x56, + 0x4d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, + 0x79, 0x6e, 0x63, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, + 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x44, 0x56, 0x4d, 0x20, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, + 0x72, 0x6f, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, + 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, + 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, + 0x61, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x2e, 0x20, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, + 0x53, 0x49, 0x78, 0x5f, 0x52, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x74, 0x6f, + 0x20, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, + 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, + 0x6b, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, + 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, + 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x3a, 0x20, 0x52, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x53, 0x20, 0x69, 0x73, 0x20, 0x48, 0x49, 0x47, + 0x48, 0x2c, 0x20, 0x52, 0x52, 0x45, 0x41, 0x44, 0x59, 0x53, 0x20, 0x69, + 0x73, 0x20, 0x4c, 0x4f, 0x57, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, + 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x61, 0x6e, 0x79, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, + 0x6b, 0x65, 0x3a, 0x20, 0x61, 0x6e, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x64, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, + 0x3a, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x65, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, + 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, + 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x2c, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2d, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x3a, + 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, + 0x3a, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x2d, 0x20, 0x6f, 0x72, 0x20, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x61, + 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x61, + 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x31, + 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x3a, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x32, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, + 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x3a, 0x20, 0x45, 0x76, 0x69, 0x63, 0x74, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, + 0x20, 0x45, 0x76, 0x69, 0x63, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x33, 0x22, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x20, + 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, + 0x63, 0x6b, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x2e, 0x20, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x53, + 0x49, 0x78, 0x5f, 0x57, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x61, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x30, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x63, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4d, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x31, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x65, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x32, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x20, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, + 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x79, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x45, 0x54, 0x52, 0x59, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x35, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, + 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x49, 0x44, 0x20, 0x68, 0x61, + 0x7a, 0x61, 0x72, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x49, 0x44, + 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x37, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, + 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, + 0x63, 0x6b, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x2e, 0x20, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x4d, + 0x49, 0x78, 0x5f, 0x52, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x2e, 0x20, 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x43, + 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x43, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, + 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x38, 0x22, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x3a, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x20, 0x68, + 0x61, 0x7a, 0x61, 0x72, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x62, 0x61, + 0x72, 0x72, 0x69, 0x65, 0x72, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x39, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x62, + 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, + 0x65, 0x72, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x61, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x63, + 0x6b, 0x65, 0x72, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x66, 0x75, 0x6c, 0x6c, 0x2e, 0x20, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, + 0x73, 0x65, 0x20, 0x4d, 0x49, 0x78, 0x5f, 0x57, 0x5f, 0x4d, 0x41, 0x58, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x2e, 0x20, 0x53, 0x65, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x4c, 0x69, + 0x6e, 0x6b, 0x20, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x49, 0x5f, 0x34, 0x30, 0x30, 0x2d, 0x72, 0x31, 0x5f, 0x63, + 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x34, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x5f, + 0x34, 0x30, 0x30, 0x2d, 0x72, 0x31, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, + 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x5f, 0x34, 0x30, 0x30, 0x2d, 0x72, 0x31, 0x5f, 0x63, 0x63, 0x6e, + 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x66, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x20, 0x43, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, + 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, + 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, + 0x76, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, + 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x32, + 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x31, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, + 0x3d, 0x22, 0x30, 0x78, 0x34, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x53, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x32, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x33, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x20, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x38, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x53, 0x34, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x34, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x61, 0x6e, 0x79, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, + 0x20, 0x61, 0x6e, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, + 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, + 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x2c, 0x20, 0x6e, + 0x6f, 0x6e, 0x2d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2d, 0x73, + 0x68, 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x62, 0x75, + 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, + 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x73, + 0x68, 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x2d, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x2d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, + 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x61, + 0x72, 0x72, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x44, 0x56, 0x4d, 0x20, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, + 0x61, 0x64, 0x3a, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, + 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x36, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, + 0x61, 0x64, 0x3a, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x62, 0x61, 0x72, + 0x72, 0x69, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, + 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, + 0x72, 0x6f, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, + 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x37, 0x22, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x44, 0x56, 0x4d, + 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x6f, + 0x20, 0x73, 0x79, 0x6e, 0x63, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x44, 0x56, 0x4d, 0x20, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x44, 0x56, 0x4d, 0x20, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6e, 0x63, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, + 0x65, 0x3a, 0x20, 0x44, 0x56, 0x4d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x3a, 0x20, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x2e, 0x20, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x53, 0x49, 0x78, + 0x5f, 0x52, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, + 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, + 0x6b, 0x65, 0x3a, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x62, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x3a, 0x20, 0x52, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x53, 0x20, 0x69, 0x73, 0x20, 0x48, 0x49, 0x47, 0x48, 0x2c, 0x20, + 0x52, 0x52, 0x45, 0x41, 0x44, 0x59, 0x53, 0x20, 0x69, 0x73, 0x20, 0x4c, + 0x4f, 0x57, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, + 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x61, 0x6e, 0x79, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, + 0x20, 0x61, 0x6e, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x64, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x65, 0x22, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, + 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, + 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x2c, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x2d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, + 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x2d, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x2d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x61, 0x62, 0x6c, 0x65, + 0x2c, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x20, + 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x3a, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x31, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, + 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, + 0x69, 0x6e, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x32, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x3a, + 0x20, 0x45, 0x76, 0x69, 0x63, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x68, + 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x3a, 0x20, 0x45, 0x76, + 0x69, 0x63, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x33, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, + 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x3a, + 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x2e, 0x20, 0x49, + 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x53, 0x49, 0x78, 0x5f, + 0x57, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, + 0x61, 0x64, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x73, 0x6c, + 0x61, 0x76, 0x65, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x73, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x49, 0x44, 0x20, 0x68, 0x61, + 0x7a, 0x61, 0x72, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x61, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x30, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x63, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4d, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x31, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x65, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x32, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x20, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, + 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x79, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x45, 0x54, 0x52, 0x59, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x31, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, + 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, 0x2e, 0x20, 0x41, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x76, + 0x65, 0x72, 0x6c, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x3a, 0x20, 0x49, 0x44, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x49, 0x44, + 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, + 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x51, 0x6f, 0x53, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, + 0x69, 0x67, 0x68, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x2e, 0x20, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x4d, + 0x49, 0x78, 0x5f, 0x52, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x3a, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x20, 0x68, 0x61, + 0x7a, 0x61, 0x72, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x62, 0x61, 0x72, + 0x72, 0x69, 0x65, 0x72, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x35, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, + 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x62, 0x61, + 0x72, 0x72, 0x69, 0x65, 0x72, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x36, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x72, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x2e, 0x20, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x4d, 0x49, 0x78, + 0x5f, 0x57, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x37, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, + 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, + 0x4c, 0x6f, 0x77, 0x20, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x41, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, + 0x20, 0x51, 0x6f, 0x53, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x20, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, + 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x73, 0x6c, 0x6f, + 0x74, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x75, + 0x6d, 0x20, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x41, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x51, + 0x6f, 0x53, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x20, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x73, 0x6c, + 0x6f, 0x74, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x20, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x39, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, + 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x56, + 0x4e, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x77, 0x61, 0x69, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x51, 0x56, + 0x4e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x56, + 0x4e, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, + 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, + 0x56, 0x4e, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x61, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x6c, + 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x77, 0x61, 0x69, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x51, + 0x56, 0x4e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6f, 0x6e, 0x20, + 0x56, 0x4e, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x3a, + 0x20, 0x56, 0x4e, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, + 0x6c, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x77, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x51, 0x56, 0x4e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6f, 0x6e, + 0x20, 0x56, 0x4e, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6c, 0x6c, + 0x3a, 0x20, 0x56, 0x4e, 0x33, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x77, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x77, + 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x20, 0x51, 0x56, 0x4e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6f, + 0x6e, 0x20, 0x56, 0x4e, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x64, 0x22, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x53, 0x74, 0x61, + 0x6c, 0x6c, 0x3a, 0x20, 0x56, 0x4e, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, + 0x73, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x20, 0x51, 0x56, 0x4e, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x56, 0x4e, 0x30, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x65, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x56, 0x4e, 0x31, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x41, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x74, + 0x20, 0x77, 0x61, 0x73, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x51, 0x56, 0x4e, 0x20, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x56, 0x4e, 0x31, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x66, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, 0x2d, 0x34, 0x30, + 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x3a, 0x20, 0x56, 0x4e, + 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x77, 0x61, 0x69, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x51, 0x56, + 0x4e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x56, + 0x4e, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x49, + 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x3a, + 0x20, 0x56, 0x4e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, + 0x6c, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x77, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x51, 0x56, 0x4e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6f, 0x6e, + 0x20, 0x56, 0x4e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x31, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x49, 0x2d, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, 0x69, 0x6e, + 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6c, + 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x61, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x68, 0x61, 0x7a, 0x61, 0x72, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x5f, 0x63, + 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x34, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, + 0x35, 0x30, 0x34, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, + 0x34, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x20, 0x43, + 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, + 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, 0x5f, + 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, 0x20, 0x30, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x30, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, + 0x20, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x20, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x32, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, 0x20, 0x32, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x32, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x33, 0x30, 0x30, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, + 0x20, 0x33, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x20, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x34, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, 0x20, 0x34, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x34, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x35, 0x30, 0x30, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, + 0x20, 0x35, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x20, 0x35, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x36, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, 0x20, 0x36, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x36, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x37, 0x30, 0x30, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, + 0x20, 0x37, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x20, 0x37, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x38, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, 0x20, 0x38, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x38, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x39, 0x30, 0x30, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, + 0x20, 0x39, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x20, 0x39, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x41, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, 0x20, 0x31, 0x30, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x43, 0x72, 0x6f, 0x73, 0x73, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x31, + 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x30, 0x31, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x30, 0x3a, 0x20, 0x52, 0x45, 0x51, 0x3a, 0x20, 0x48, 0x2d, + 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, + 0x20, 0x52, 0x45, 0x51, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x48, 0x2d, + 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, + 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x30, 0x32, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, + 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, + 0x20, 0x30, 0x3a, 0x20, 0x52, 0x45, 0x51, 0x3a, 0x20, 0x53, 0x2d, 0x62, + 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, + 0x52, 0x45, 0x51, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x53, 0x2d, 0x62, + 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, + 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, + 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x30, 0x33, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, + 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, + 0x30, 0x3a, 0x20, 0x52, 0x45, 0x51, 0x3a, 0x20, 0x50, 0x2d, 0x43, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, 0x52, + 0x45, 0x51, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x50, 0x2d, 0x43, 0x6e, + 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, + 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x2d, + 0x43, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x53, 0x4e, 0x50, 0x20, 0x56, 0x43, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x30, 0x34, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x30, 0x3a, 0x20, 0x52, 0x45, 0x51, 0x3a, 0x20, 0x54, 0x6b, + 0x6e, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, + 0x52, 0x45, 0x51, 0x3a, 0x20, 0x4e, 0x6f, 0x20, 0x54, 0x6b, 0x6e, 0x56, + 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x61, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x38, 0x30, 0x39, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, + 0x45, 0x51, 0x3a, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x45, 0x51, 0x3a, 0x20, + 0x53, 0x65, 0x74, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x38, 0x30, 0x41, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x45, + 0x51, 0x3a, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x45, 0x51, 0x3a, 0x20, 0x53, + 0x65, 0x74, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x38, 0x30, 0x42, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x45, 0x51, + 0x3a, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x45, 0x51, 0x3a, 0x20, 0x53, 0x65, + 0x74, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2e, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4e, 0x50, 0x20, 0x56, 0x43, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x38, 0x30, 0x43, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, + 0x45, 0x51, 0x3a, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x45, 0x51, 0x3a, 0x20, 0x4e, + 0x6f, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, + 0x69, 0x74, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x31, 0x31, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x30, 0x3a, 0x20, 0x52, 0x53, 0x50, 0x3a, 0x20, 0x48, 0x2d, + 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, + 0x20, 0x52, 0x53, 0x50, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x48, 0x2d, + 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, + 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x31, 0x32, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, + 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, + 0x20, 0x30, 0x3a, 0x20, 0x52, 0x53, 0x50, 0x3a, 0x20, 0x53, 0x2d, 0x62, + 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, + 0x52, 0x53, 0x50, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x53, 0x2d, 0x62, + 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, + 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, + 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x31, 0x33, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, + 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, + 0x30, 0x3a, 0x20, 0x52, 0x53, 0x50, 0x3a, 0x20, 0x50, 0x2d, 0x43, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, 0x52, + 0x53, 0x50, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x50, 0x2d, 0x43, 0x6e, + 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, + 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x2d, + 0x43, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x53, 0x4e, 0x50, 0x20, 0x56, 0x43, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x31, 0x34, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x30, 0x3a, 0x20, 0x52, 0x53, 0x50, 0x3a, 0x20, 0x54, 0x6b, + 0x6e, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, + 0x52, 0x53, 0x50, 0x3a, 0x20, 0x4e, 0x6f, 0x20, 0x54, 0x6b, 0x6e, 0x56, + 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x61, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x38, 0x31, 0x39, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, + 0x53, 0x50, 0x3a, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x53, 0x50, 0x3a, 0x20, + 0x53, 0x65, 0x74, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x38, 0x31, 0x41, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x53, + 0x50, 0x3a, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x53, 0x50, 0x3a, 0x20, 0x53, + 0x65, 0x74, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x38, 0x31, 0x42, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x53, 0x50, + 0x3a, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x53, 0x50, 0x3a, 0x20, 0x53, 0x65, + 0x74, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2e, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4e, 0x50, 0x20, 0x56, 0x43, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x38, 0x31, 0x43, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, + 0x53, 0x50, 0x3a, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x52, 0x53, 0x50, 0x3a, 0x20, 0x4e, + 0x6f, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, + 0x69, 0x74, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x32, 0x31, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x30, 0x3a, 0x20, 0x53, 0x4e, 0x50, 0x3a, 0x20, 0x48, 0x2d, + 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, + 0x20, 0x53, 0x4e, 0x50, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x48, 0x2d, + 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, + 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x32, 0x32, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, + 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, + 0x20, 0x30, 0x3a, 0x20, 0x53, 0x4e, 0x50, 0x3a, 0x20, 0x53, 0x2d, 0x62, + 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, + 0x53, 0x4e, 0x50, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x53, 0x2d, 0x62, + 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, + 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, + 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x32, 0x33, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, + 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, + 0x30, 0x3a, 0x20, 0x53, 0x4e, 0x50, 0x3a, 0x20, 0x50, 0x2d, 0x43, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, 0x53, + 0x4e, 0x50, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x50, 0x2d, 0x43, 0x6e, + 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, + 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x2d, + 0x43, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x53, 0x4e, 0x50, 0x20, 0x56, 0x43, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x32, 0x34, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x30, 0x3a, 0x20, 0x53, 0x4e, 0x50, 0x3a, 0x20, 0x54, 0x6b, + 0x6e, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, + 0x53, 0x4e, 0x50, 0x3a, 0x20, 0x4e, 0x6f, 0x20, 0x54, 0x6b, 0x6e, 0x56, + 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x61, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x38, 0x32, 0x39, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x53, + 0x4e, 0x50, 0x3a, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x53, 0x4e, 0x50, 0x3a, 0x20, + 0x53, 0x65, 0x74, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x38, 0x32, 0x41, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x53, 0x4e, + 0x50, 0x3a, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x53, 0x4e, 0x50, 0x3a, 0x20, 0x53, + 0x65, 0x74, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x38, 0x32, 0x42, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x53, 0x4e, 0x50, + 0x3a, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x31, 0x3a, 0x20, 0x53, 0x4e, 0x50, 0x3a, 0x20, 0x53, 0x65, + 0x74, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2e, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4e, 0x50, 0x20, 0x56, 0x43, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x38, 0x32, 0x43, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x53, + 0x4e, 0x50, 0x3a, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x53, 0x4e, 0x50, 0x3a, 0x20, 0x4e, + 0x6f, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, + 0x69, 0x74, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x33, 0x31, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x30, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x3a, 0x20, 0x48, 0x2d, + 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, + 0x20, 0x44, 0x41, 0x54, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x48, 0x2d, + 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, + 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x33, 0x32, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, + 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, + 0x20, 0x30, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x3a, 0x20, 0x53, 0x2d, 0x62, + 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, + 0x44, 0x41, 0x54, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x53, 0x2d, 0x62, + 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, + 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, + 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x33, 0x33, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, + 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, + 0x30, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x3a, 0x20, 0x50, 0x2d, 0x43, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, 0x44, + 0x41, 0x54, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, 0x50, 0x2d, 0x43, 0x6e, + 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, + 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x2d, + 0x43, 0x6e, 0x74, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x53, 0x4e, 0x50, 0x20, 0x56, 0x43, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x33, 0x34, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x30, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x3a, 0x20, 0x54, 0x6b, + 0x6e, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, + 0x44, 0x41, 0x54, 0x3a, 0x20, 0x4e, 0x6f, 0x20, 0x54, 0x6b, 0x6e, 0x56, + 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x61, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x38, 0x33, 0x39, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, + 0x41, 0x54, 0x3a, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x3a, 0x20, + 0x53, 0x65, 0x74, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x38, 0x33, 0x41, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, + 0x54, 0x3a, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x3a, 0x20, 0x53, + 0x65, 0x74, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x38, 0x33, 0x42, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, + 0x3a, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x3a, 0x20, 0x53, 0x65, + 0x74, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2e, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4e, 0x50, 0x20, 0x56, 0x43, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x38, 0x33, 0x43, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, + 0x41, 0x54, 0x3a, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x3a, 0x20, 0x4e, + 0x6f, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, + 0x69, 0x74, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x37, 0x31, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x30, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, 0x20, 0x48, + 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, + 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, 0x20, 0x53, 0x65, 0x74, 0x20, + 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x37, 0x32, + 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, + 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, 0x20, + 0x53, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, + 0x30, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, 0x20, 0x53, 0x65, 0x74, + 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x37, + 0x33, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, + 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, + 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, + 0x20, 0x30, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, 0x20, 0x53, 0x65, + 0x74, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2e, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4e, 0x50, 0x20, 0x56, 0x43, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x38, 0x37, 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, 0x44, + 0x41, 0x54, 0x42, 0x3a, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x30, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, + 0x20, 0x4e, 0x6f, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x2c, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x37, + 0x39, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, + 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, + 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, + 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, 0x20, 0x53, 0x65, + 0x74, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x48, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, + 0x37, 0x41, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, + 0x3a, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, 0x20, 0x53, + 0x65, 0x74, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x2d, 0x62, 0x69, 0x74, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x38, 0x37, 0x42, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, + 0x42, 0x3a, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, 0x20, + 0x53, 0x65, 0x74, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2c, 0x20, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x73, 0x65, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x2d, 0x43, 0x6e, 0x74, 0x2e, + 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4e, 0x50, 0x20, + 0x56, 0x43, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x38, 0x37, 0x43, 0x22, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x58, 0x50, 0x5f, + 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, + 0x20, 0x44, 0x41, 0x54, 0x42, 0x3a, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x31, 0x3a, 0x20, 0x44, 0x41, 0x54, + 0x42, 0x3a, 0x20, 0x4e, 0x6f, 0x20, 0x54, 0x6b, 0x6e, 0x56, 0x2c, 0x20, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x58, 0x50, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x48, 0x4e, + 0x2d, 0x46, 0x20, 0x33, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x46, 0x75, 0x6c, 0x6c, 0x79, + 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x48, 0x6f, + 0x6d, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x33, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x31, 0x30, 0x30, 0x30, 0x30, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, + 0x20, 0x35, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x2d, 0x63, + 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x48, 0x6f, 0x6d, 0x65, + 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x35, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, + 0x3d, 0x22, 0x30, 0x78, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x20, 0x37, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x2d, 0x63, 0x6f, 0x68, + 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x20, 0x4e, + 0x6f, 0x64, 0x65, 0x20, 0x37, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x32, 0x33, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x20, 0x38, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x20, 0x4e, 0x6f, 0x64, + 0x65, 0x20, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x32, 0x34, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x20, 0x31, 0x33, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, + 0x20, 0x31, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x32, 0x35, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x20, 0x31, 0x35, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, + 0x20, 0x31, 0x35, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x20, 0x31, 0x37, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, + 0x20, 0x31, 0x37, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x20, 0x31, 0x38, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, + 0x20, 0x31, 0x38, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x30, + 0x31, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x4d, 0x69, 0x73, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x20, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x30, + 0x32, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x33, 0x20, 0x53, 0x46, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x20, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, + 0x73, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x30, 0x33, 0x22, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x48, 0x4e, + 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, + 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x46, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x4e, + 0x20, 0x4c, 0x33, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4c, 0x33, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, + 0x30, 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x4f, 0x43, 0x51, 0x20, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, + 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x64, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x30, + 0x35, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x50, 0x4f, 0x43, 0x51, 0x20, 0x52, 0x65, 0x71, 0x73, 0x20, + 0x52, 0x65, 0x63, 0x76, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x48, 0x4e, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x30, 0x36, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x48, + 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x46, + 0x20, 0x48, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x20, 0x68, 0x69, 0x74, 0x73, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, + 0x30, 0x37, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x46, 0x20, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x34, 0x30, 0x38, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, + 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6e, 0x6f, 0x6f, 0x70, 0x73, + 0x20, 0x53, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x20, + 0x73, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x44, 0x6f, 0x65, 0x73, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x74, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, + 0x20, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, + 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x30, 0x39, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, + 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, + 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x20, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, + 0x61, 0x73, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x62, 0x72, 0x6f, + 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x34, 0x30, 0x41, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, + 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x33, 0x20, 0x45, 0x76, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4c, 0x33, 0x20, 0x65, 0x76, 0x69, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x30, 0x42, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, + 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x33, 0x20, 0x46, 0x69, 0x6c, 0x6c, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x57, 0x61, 0x79, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4c, 0x33, 0x20, 0x66, 0x69, 0x6c, + 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x77, 0x61, 0x79, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x30, + 0x43, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x43, 0x20, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, + 0x30, 0x44, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4d, 0x43, 0x20, 0x52, 0x65, 0x71, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x30, 0x45, + 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x48, 0x4e, 0x2d, 0x46, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x51, 0x4f, 0x53, 0x20, 0x48, 0x48, 0x20, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x20, 0x68, 0x69, 0x67, + 0x68, 0x65, 0x73, 0x74, 0x2d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x20, 0x51, 0x6f, 0x53, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x77, 0x61, 0x73, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x4e, 0x2d, 0x46, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x4e, 0x2d, 0x49, 0x20, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2f, 0x4f, 0x2d, + 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4e, 0x6f, 0x64, 0x65, + 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x32, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x20, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2f, + 0x4f, 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4e, 0x6f, + 0x64, 0x65, 0x20, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, + 0x78, 0x38, 0x36, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x20, 0x36, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x2f, 0x4f, 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, + 0x22, 0x30, 0x78, 0x38, 0x43, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x20, 0x31, 0x32, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x2f, 0x4f, 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x31, 0x32, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x4e, 0x2d, + 0x49, 0x20, 0x31, 0x36, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2f, 0x4f, 0x2d, 0x63, + 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, + 0x31, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x39, + 0x34, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x20, 0x32, 0x30, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x2f, 0x4f, 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4e, + 0x6f, 0x64, 0x65, 0x20, 0x32, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x36, 0x30, 0x31, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x5f, 0x52, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x30, 0x20, 0x52, 0x44, 0x61, 0x74, + 0x61, 0x42, 0x65, 0x61, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x30, 0x20, + 0x52, 0x44, 0x61, 0x74, 0x61, 0x42, 0x65, 0x61, 0x74, 0x73, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x36, 0x30, 0x32, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x5f, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x31, 0x20, 0x52, 0x44, 0x61, 0x74, 0x61, + 0x42, 0x65, 0x61, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x31, 0x20, 0x52, + 0x44, 0x61, 0x74, 0x61, 0x42, 0x65, 0x61, 0x74, 0x73, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, + 0x30, 0x33, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x32, 0x20, 0x52, 0x44, 0x61, 0x74, 0x61, 0x42, + 0x65, 0x61, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x32, 0x20, 0x52, 0x44, + 0x61, 0x74, 0x61, 0x42, 0x65, 0x61, 0x74, 0x73, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x30, + 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x58, 0x44, 0x41, 0x54, 0x20, 0x46, 0x6c, 0x69, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x52, 0x58, 0x44, 0x41, 0x54, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, + 0x30, 0x35, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x54, 0x58, 0x44, 0x41, 0x54, 0x20, 0x46, 0x6c, 0x69, + 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x58, + 0x44, 0x41, 0x54, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, 0x20, 0x73, 0x65, + 0x6e, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x36, 0x30, 0x36, 0x22, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x52, 0x4e, 0x2d, + 0x49, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x54, 0x58, 0x52, 0x45, 0x51, 0x20, 0x46, 0x6c, 0x69, 0x74, + 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x54, 0x58, 0x52, 0x45, 0x51, 0x20, 0x46, 0x6c, 0x69, + 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x30, 0x37, + 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, 0x54, 0x58, 0x52, + 0x45, 0x51, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, + 0x54, 0x58, 0x52, 0x45, 0x51, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, 0x20, + 0x73, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x30, 0x38, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x52, + 0x4e, 0x2d, 0x49, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x52, + 0x54, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x52, 0x54, + 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x30, 0x39, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x52, 0x4e, 0x2d, 0x49, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, + 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, + 0x52, 0x54, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x52, + 0x54, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x30, 0x41, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x52, 0x4e, 0x2d, 0x49, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, + 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x20, 0x54, 0x58, 0x52, + 0x45, 0x51, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x20, 0x54, 0x58, 0x52, 0x45, + 0x51, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x42, + 0x41, 0x53, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x31, 0x30, 0x30, 0x30, 0x30, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x42, 0x41, 0x53, 0x20, + 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x43, 0x45, 0x20, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x43, 0x48, 0x49, 0x20, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, + 0x65, 0x20, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x38, 0x39, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x53, 0x42, 0x41, 0x53, 0x20, 0x39, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, + 0x43, 0x45, 0x20, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x43, 0x48, 0x49, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x20, 0x39, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x42, 0x30, 0x30, 0x30, + 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x42, 0x41, + 0x53, 0x20, 0x31, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x43, 0x45, 0x20, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x43, 0x48, 0x49, + 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x62, 0x72, + 0x69, 0x64, 0x67, 0x65, 0x20, 0x31, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, + 0x3d, 0x22, 0x30, 0x78, 0x39, 0x33, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x42, 0x41, 0x53, 0x20, 0x31, + 0x39, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x43, 0x45, 0x20, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x43, 0x48, 0x49, 0x20, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, + 0x65, 0x20, 0x31, 0x39, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, + 0x30, 0x31, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x53, 0x42, 0x41, 0x53, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x30, 0x20, 0x52, 0x44, 0x61, 0x74, 0x61, 0x42, + 0x65, 0x61, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x30, 0x20, 0x52, 0x44, + 0x61, 0x74, 0x61, 0x42, 0x65, 0x61, 0x74, 0x73, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x30, + 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x53, 0x42, 0x41, 0x53, 0x5f, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x58, 0x44, 0x41, 0x54, 0x20, 0x46, 0x6c, 0x69, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x52, 0x58, 0x44, 0x41, 0x54, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, + 0x30, 0x35, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x53, 0x42, 0x41, 0x53, 0x5f, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x54, 0x58, 0x44, 0x41, 0x54, 0x20, 0x46, 0x6c, 0x69, + 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x58, + 0x44, 0x41, 0x54, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, 0x20, 0x73, 0x65, + 0x6e, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x30, 0x30, 0x36, 0x22, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x42, 0x41, + 0x53, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, 0x30, 0x34, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x54, 0x58, 0x52, 0x45, 0x51, 0x20, 0x46, 0x6c, 0x69, 0x74, + 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x54, 0x58, 0x52, 0x45, 0x51, 0x20, 0x46, 0x6c, 0x69, + 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x30, 0x37, + 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x53, 0x42, 0x41, 0x53, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, + 0x4e, 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, 0x54, 0x58, 0x52, + 0x45, 0x51, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x64, 0x20, + 0x54, 0x58, 0x52, 0x45, 0x51, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, 0x20, + 0x73, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x30, 0x38, 0x22, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, + 0x42, 0x41, 0x53, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, 0x35, + 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x52, + 0x54, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x52, 0x54, + 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x30, 0x39, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x53, 0x42, 0x41, 0x53, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, 0x2d, + 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, + 0x52, 0x54, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x52, + 0x54, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x30, 0x41, 0x22, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x53, 0x42, 0x41, 0x53, 0x5f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x43, 0x4e, + 0x2d, 0x35, 0x30, 0x34, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x20, 0x54, 0x58, 0x52, + 0x45, 0x51, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x20, 0x54, 0x58, 0x52, 0x45, + 0x51, 0x20, 0x46, 0x6c, 0x69, 0x74, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, + 0x41, 0x31, 0x35, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x3d, 0x22, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x31, + 0x35, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, + 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x31, 0x35, 0x5f, 0x63, 0x6e, 0x74, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, + 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, + 0x78, 0x5f, 0x41, 0x31, 0x35, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, + 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3d, 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, + 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, + 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, + 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, + 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, + 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x72, + 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, + 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, + 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, + 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, + 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x61, 0x6b, 0x65, 0x6e, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, + 0x54, 0x49, 0x44, 0x52, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, + 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, + 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x65, 0x64, + 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, + 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, + 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x33, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x35, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x38, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, + 0x42, 0x61, 0x63, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x2d, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x70, 0x65, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x63, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, + 0x79, 0x63, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x2d, + 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x30, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, + 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x34, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x33, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, 0x20, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x34, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x76, + 0x69, 0x63, 0x74, 0x69, 0x6d, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x42, 0x61, 0x63, + 0x6b, 0x20, 0x2d, 0x20, 0x56, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x37, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, + 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x38, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x63, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x54, 0x4c, 0x42, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x34, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x54, + 0x4c, 0x42, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, + 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x35, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, + 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x35, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, + 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, + 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x35, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x76, 0x69, 0x63, + 0x74, 0x69, 0x6d, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x20, + 0x2d, 0x20, 0x56, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x37, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x68, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x38, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x69, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x31, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x34, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x4e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x36, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x50, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x2d, 0x20, 0x50, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, + 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x36, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x37, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x38, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x52, 0x65, 0x61, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, + 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x61, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x44, 0x52, 0x45, 0x58, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, + 0x20, 0x4c, 0x44, 0x52, 0x45, 0x58, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x64, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, + 0x69, 0x63, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x54, + 0x52, 0x45, 0x58, 0x20, 0x70, 0x61, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x54, + 0x52, 0x45, 0x58, 0x20, 0x70, 0x61, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x65, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x69, + 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, + 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x30, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, + 0x4c, 0x6f, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x37, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x37, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, + 0x2d, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x37, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x64, 0x76, 0x61, 0x6e, + 0x63, 0x65, 0x64, 0x20, 0x53, 0x49, 0x4d, 0x44, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, + 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x53, 0x49, 0x4d, + 0x44, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x37, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x46, 0x50, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, + 0x2d, 0x20, 0x56, 0x46, 0x50, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, + 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x43, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x38, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x62, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x20, 0x2d, 0x20, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x39, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, + 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x61, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x2d, 0x20, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x63, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x53, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x61, 0x72, 0x72, + 0x69, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x2d, 0x20, 0x49, 0x53, 0x42, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x64, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x44, 0x53, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x61, 0x72, 0x72, + 0x69, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x2d, 0x20, 0x44, 0x53, 0x42, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x65, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x44, 0x4d, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x61, 0x72, 0x72, + 0x69, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x2d, 0x20, 0x44, 0x4d, 0x42, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, + 0x41, 0x31, 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x3d, 0x22, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x31, + 0x37, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, + 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x31, 0x37, 0x5f, 0x63, 0x6e, 0x74, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, + 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, + 0x78, 0x5f, 0x41, 0x31, 0x37, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, + 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3d, 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, + 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, + 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, + 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, + 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x74, 0x20, 0x6c, + 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, + 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, + 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x61, 0x6b, 0x65, + 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x4f, 0x4e, 0x54, + 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, + 0x44, 0x52, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, + 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x32, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, + 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x33, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x34, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x38, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x39, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x20, 0x2d, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x63, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, + 0x63, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x2d, 0x20, + 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, + 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x34, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x35, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, + 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x36, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x56, 0x69, 0x63, 0x74, + 0x69, 0x6d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x20, + 0x2d, 0x20, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x35, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x2d, 0x20, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x2d, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x2d, 0x20, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, + 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x65, 0x72, + 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x50, + 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x36, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, + 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x37, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, + 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x39, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, + 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x63, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, + 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x44, 0x52, 0x45, 0x58, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x4c, 0x44, 0x52, + 0x45, 0x58, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, + 0x66, 0x61, 0x69, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, + 0x66, 0x61, 0x69, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x36, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x54, 0x52, 0x45, + 0x58, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x20, 0x2d, 0x20, 0x53, 0x54, 0x52, 0x45, 0x58, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x4c, 0x6f, + 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x37, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x32, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x6f, + 0x72, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x33, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, + 0x64, 0x20, 0x53, 0x49, 0x4d, 0x44, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x41, 0x64, + 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x53, 0x49, 0x4d, 0x44, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x46, 0x50, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, + 0x56, 0x46, 0x50, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x37, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6f, 0x66, + 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x20, 0x2d, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, + 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x50, 0x43, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x62, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, + 0x2d, 0x20, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x39, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x20, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x61, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x20, 0x2d, 0x20, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x63, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x49, 0x53, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x20, 0x2d, 0x20, 0x49, 0x53, 0x42, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x64, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x44, 0x53, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x20, 0x2d, 0x20, 0x44, 0x53, 0x42, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x65, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x44, 0x4d, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x20, 0x2d, 0x20, 0x44, 0x4d, 0x42, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x31, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, + 0x6e, 0x2c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x79, 0x6e, + 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x61, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x48, + 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, 0x43, 0x61, + 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x63, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x20, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x63, 0x31, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x50, + 0x61, 0x67, 0x65, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x57, 0x61, + 0x6c, 0x6b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x69, 0x64, 0x65, 0x20, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x61, 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x57, 0x61, 0x6c, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x63, 0x32, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x34, 0x20, 0x57, 0x61, 0x79, 0x73, + 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x34, 0x20, 0x77, 0x61, 0x79, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x2d, 0x20, 0x54, 0x61, 0x67, 0x20, 0x52, 0x41, 0x4d, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x63, + 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, + 0x61, 0x79, 0x73, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x2d, 0x20, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x52, 0x41, 0x4d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x63, 0x34, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x54, 0x43, 0x20, 0x52, + 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x77, 0x61, 0x79, 0x73, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x54, 0x41, + 0x43, 0x20, 0x52, 0x41, 0x4d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x63, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6e, 0x6f, 0x6f, 0x70, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, + 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2e, + 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x31, 0x37, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x61, 0x74, + 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x69, + 0x73, 0x73, 0x75, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2e, + 0x20, 0x49, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, + 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, + 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x62, 0x65, 0x61, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x64, 0x33, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x6f, 0x74, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, + 0x2d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, + 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2d, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x20, 0x61, 0x72, 0x65, + 0x20, 0x62, 0x75, 0x73, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x64, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x2d, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x49, 0x73, 0x73, 0x75, 0x65, 0x20, 0x51, 0x75, + 0x65, 0x75, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, + 0x69, 0x63, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x6f, 0x74, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, + 0x64, 0x2d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x49, 0x73, 0x73, 0x75, + 0x65, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x62, 0x75, 0x73, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x64, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x73, 0x73, 0x75, + 0x65, 0x20, 0x51, 0x75, 0x65, 0x75, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, + 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x62, 0x75, 0x73, + 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x64, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x20, 0x49, 0x73, 0x73, 0x75, 0x65, 0x20, 0x51, 0x75, 0x65, 0x75, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x45, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x62, 0x75, + 0x73, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x64, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4e, 0x45, 0x4f, 0x4e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4e, 0x45, 0x4f, 0x4e, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6c, 0x65, 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x66, 0x6c, + 0x75, 0x73, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, + 0x45, 0x20, 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x64, 0x63, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, + 0x73, 0x6f, 0x72, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, + 0x72, 0x61, 0x70, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x72, 0x61, 0x70, 0x20, 0x74, 0x6f, + 0x20, 0x68, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x64, + 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x54, + 0x4d, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x58, 0x54, + 0x4f, 0x55, 0x54, 0x20, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, 0x54, 0x4d, 0x20, + 0x45, 0x58, 0x54, 0x4f, 0x55, 0x54, 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x64, 0x66, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x54, 0x4d, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x58, 0x54, 0x4f, 0x55, 0x54, + 0x20, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, 0x54, 0x4d, 0x20, 0x45, 0x58, 0x54, + 0x4f, 0x55, 0x54, 0x20, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x65, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x4d, 0x55, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x57, 0x61, 0x6c, + 0x6b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x61, 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x65, 0x31, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x4d, 0x55, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x67, + 0x65, 0x31, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x57, 0x61, 0x6c, + 0x6b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x61, 0x20, 0x53, 0x74, 0x61, 0x67, 0x65, + 0x31, 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x65, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x4d, 0x55, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x67, 0x65, 0x32, 0x20, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x57, 0x61, 0x6c, 0x6b, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x75, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, + 0x61, 0x20, 0x53, 0x74, 0x61, 0x67, 0x65, 0x32, 0x20, 0x50, 0x61, 0x67, + 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x6c, 0x6b, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x65, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x4d, 0x55, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x53, + 0x55, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x57, 0x61, 0x6c, 0x6b, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x20, 0x61, 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x65, 0x34, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x4d, 0x55, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x57, 0x61, + 0x6c, 0x6b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x61, 0x20, 0x50, 0x61, 0x67, 0x65, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x64, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x65, 0x35, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x4d, 0x55, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x57, 0x61, 0x6c, + 0x6b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x61, 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x61, 0x20, 0x50, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, + 0x20, 0x50, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x65, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x4d, 0x55, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x63, 0x70, 0x31, 0x35, 0x20, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x57, 0x61, 0x6c, 0x6b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, + 0x4d, 0x55, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x61, 0x20, + 0x50, 0x61, 0x67, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, + 0x61, 0x6c, 0x6b, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x63, 0x70, 0x31, 0x35, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6d, + 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x62, + 0x79, 0x20, 0x4d, 0x56, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x56, 0x41, + 0x2d, 0x74, 0x6f, 0x2d, 0x50, 0x41, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x65, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x50, 0x4c, 0x44, 0x20, + 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x50, 0x4c, 0x44, + 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x65, + 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x31, 0x20, 0x43, 0x50, 0x31, 0x35, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x31, 0x20, 0x43, 0x50, 0x31, 0x35, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x65, 0x39, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x54, 0x4c, + 0x42, 0x20, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x66, 0x6c, + 0x75, 0x73, 0x68, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x65, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x32, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x65, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x32, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, + 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x33, + 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, + 0x22, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x33, 0x22, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, + 0x41, 0x35, 0x33, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, + 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x33, 0x5f, 0x63, + 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, + 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, + 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, + 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, + 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, + 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, + 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, + 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, + 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x75, + 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, + 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, + 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, + 0x49, 0x44, 0x52, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, 0x20, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6d, + 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6f, + 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, + 0x65, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x31, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x42, 0x61, + 0x63, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x37, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x41, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x42, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x43, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, + 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x28, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x20, 0x70, 0x61, 0x73, 0x73, 0x29, 0x20, 0x2d, 0x20, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x62, 0x61, 0x73, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x45, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4f, 0x64, 0x64, 0x20, 0x50, 0x65, 0x72, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x64, + 0x64, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, + 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x31, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x34, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x62, + 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x56, 0x69, 0x63, 0x74, 0x69, 0x6d, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x34, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x6c, 0x65, 0x61, + 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x2d, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x38, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x34, 0x43, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, 0x20, + 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x34, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x30, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x31, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, + 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, + 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x36, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x2d, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x56, 0x69, 0x63, 0x74, + 0x69, 0x6d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x62, 0x61, 0x63, 0x6b, 0x20, + 0x2d, 0x20, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x35, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x2d, 0x20, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x2d, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x2d, 0x20, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, + 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x65, 0x72, + 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x50, + 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x36, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, + 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x37, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, + 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x39, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, + 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x41, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x43, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, + 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x44, 0x52, 0x45, 0x58, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x4c, 0x44, 0x52, 0x45, 0x58, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, 0x70, 0x61, + 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x76, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x20, 0x2d, 0x20, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, 0x70, 0x61, + 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, + 0x66, 0x61, 0x69, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x20, 0x2d, 0x20, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x37, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, + 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x31, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x37, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x6f, + 0x72, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x33, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x34, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x20, + 0x53, 0x49, 0x4d, 0x44, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, + 0x65, 0x64, 0x20, 0x53, 0x49, 0x4d, 0x44, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x35, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x56, 0x46, 0x50, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x56, 0x46, 0x50, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x36, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x6f, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x43, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x37, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x6f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x38, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x2d, 0x20, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x39, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, + 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x41, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x43, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x53, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x61, 0x72, + 0x72, 0x69, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x49, 0x53, 0x42, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x44, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x53, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x61, 0x72, + 0x72, 0x69, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x44, 0x53, 0x42, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x45, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x4d, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x61, 0x72, + 0x72, 0x69, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x44, 0x4d, 0x42, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x31, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, + 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x53, 0x75, 0x70, + 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, 0x43, 0x61, 0x6c, 0x6c, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x38, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, + 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x34, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x53, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x38, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x52, 0x51, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x49, 0x52, 0x51, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x49, 0x51, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, + 0x6e, 0x2c, 0x20, 0x46, 0x49, 0x51, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x38, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, + 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x4d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x41, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x48, + 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, 0x43, 0x61, + 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x38, 0x42, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x20, + 0x6e, 0x6f, 0x6e, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, + 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x6c, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x38, 0x43, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x53, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x6c, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x38, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x6e, 0x6f, 0x6e, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, + 0x6b, 0x65, 0x6e, 0x20, 0x2d, 0x20, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x74, 0x72, 0x61, 0x70, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x61, + 0x6b, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x52, 0x51, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, + 0x49, 0x52, 0x51, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65, + 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x46, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x46, 0x49, 0x51, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x46, 0x49, + 0x51, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x30, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, + 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x39, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, + 0x35, 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x3d, 0x22, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x37, + 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, + 0x78, 0x2d, 0x41, 0x35, 0x37, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, + 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x35, 0x37, + 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x68, 0x65, 0x72, + 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x48, + 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, + 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x4c, + 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, + 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, + 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, + 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, + 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x72, + 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, + 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x61, 0x6b, 0x65, 0x6e, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x4f, 0x4e, 0x54, 0x45, + 0x58, 0x54, 0x49, 0x44, 0x52, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, + 0x52, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, + 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x65, + 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x32, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x33, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x34, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x35, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, + 0x42, 0x61, 0x63, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x37, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x42, 0x61, 0x63, + 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x41, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x42, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x43, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x28, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x20, 0x70, 0x61, 0x73, 0x73, 0x29, 0x20, 0x2d, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x44, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x45, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4f, 0x64, 0x64, 0x20, 0x50, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4f, 0x64, 0x64, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x6e, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x30, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x31, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, + 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, + 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x36, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x2d, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x56, 0x69, 0x63, 0x74, + 0x69, 0x6d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x62, 0x61, 0x63, 0x6b, 0x20, + 0x2d, 0x20, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x34, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x43, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, + 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x44, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x35, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, + 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x32, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x35, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x36, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x2d, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x56, 0x69, + 0x63, 0x74, 0x69, 0x6d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x35, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, 0x62, 0x61, 0x63, + 0x6b, 0x20, 0x2d, 0x20, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, + 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x2d, 0x20, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, + 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x68, 0x61, 0x72, + 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x36, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x4e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x36, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, + 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, + 0x20, 0x50, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, + 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x37, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x38, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x2d, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x41, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x43, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x44, 0x52, 0x45, 0x58, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x45, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x4c, 0x44, 0x52, + 0x45, 0x58, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, + 0x70, 0x61, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x76, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, + 0x70, 0x61, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x36, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x54, 0x52, 0x45, + 0x58, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, + 0x66, 0x61, 0x69, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x37, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, + 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x20, 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x31, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x37, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, + 0x64, 0x20, 0x53, 0x49, 0x4d, 0x44, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x41, 0x64, 0x76, 0x61, + 0x6e, 0x63, 0x65, 0x64, 0x20, 0x53, 0x49, 0x4d, 0x44, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x35, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x56, 0x46, 0x50, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x56, 0x46, 0x50, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x43, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x2c, 0x20, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x38, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x49, 0x6d, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x74, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, + 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x37, 0x41, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x49, 0x6e, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x43, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x53, 0x42, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x49, 0x53, 0x42, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x53, 0x42, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x44, 0x53, 0x42, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x4d, 0x42, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x44, 0x4d, 0x42, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x38, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, + 0x73, 0x6f, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x53, + 0x75, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, 0x43, 0x61, + 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x38, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x38, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x62, 0x6f, + 0x72, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, + 0x53, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x36, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, + 0x70, 0x74, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x52, 0x51, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x49, 0x52, + 0x51, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x38, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x49, 0x51, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, + 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x46, 0x49, 0x51, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x38, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, + 0x6e, 0x2c, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x4d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x41, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, + 0x20, 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, + 0x43, 0x61, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x38, 0x42, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x72, + 0x74, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x43, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x20, 0x6e, 0x6f, 0x6e, + 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, + 0x2c, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, + 0x20, 0x6f, 0x72, 0x20, 0x53, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x6c, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x38, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4f, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x2d, 0x20, 0x4f, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x74, 0x72, 0x61, 0x70, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, + 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x38, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x52, 0x51, 0x20, 0x6e, 0x6f, 0x6e, + 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, + 0x2c, 0x20, 0x49, 0x52, 0x51, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x61, + 0x6b, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x46, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x49, 0x51, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x2c, 0x20, + 0x46, 0x49, 0x51, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65, + 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x30, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x63, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x6f, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, + 0x79, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x20, 0x2d, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x41, 0x63, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x39, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x43, 0x6f, + 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x2d, 0x20, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, + 0x65, 0x78, 0x5f, 0x41, 0x35, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, + 0x41, 0x35, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, + 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x35, 0x5f, 0x63, 0x6e, 0x74, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, + 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, + 0x78, 0x5f, 0x41, 0x35, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, + 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, + 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x63, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, + 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, + 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, + 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, + 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, + 0x42, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x77, 0x72, 0x69, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, + 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x61, + 0x6b, 0x65, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x4f, + 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, + 0x54, 0x49, 0x44, 0x52, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x43, 0x20, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x65, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x64, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x62, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, + 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2c, 0x20, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x2c, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x69, 0x73, 0x70, 0x72, 0x65, + 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x32, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, + 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, + 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x70, 0x72, 0x65, + 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x33, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x34, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x35, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x65, + 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x65, 0x76, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, + 0x74, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x52, + 0x51, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x52, 0x51, 0x20, 0x65, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x49, 0x51, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x46, 0x49, + 0x51, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x43, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x43, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x65, 0x78, 0x74, 0x20, 0x72, 0x65, 0x71, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x43, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x65, 0x74, 0x63, 0x68, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x43, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x43, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x6f, + 0x64, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, + 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x6f, + 0x64, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x43, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x43, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, + 0x54, 0x4d, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x54, + 0x4d, 0x20, 0x45, 0x78, 0x74, 0x20, 0x4f, 0x75, 0x74, 0x5b, 0x30, 0x5d, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x45, 0x54, 0x4d, 0x20, 0x2d, 0x20, 0x45, 0x54, 0x4d, + 0x20, 0x45, 0x78, 0x74, 0x20, 0x4f, 0x75, 0x74, 0x5b, 0x30, 0x5d, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x43, + 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x54, + 0x4d, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x54, 0x4d, + 0x20, 0x45, 0x78, 0x74, 0x20, 0x4f, 0x75, 0x74, 0x5b, 0x31, 0x5d, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x45, 0x54, 0x4d, 0x20, 0x2d, 0x20, 0x45, 0x54, 0x4d, 0x20, + 0x45, 0x78, 0x74, 0x20, 0x4f, 0x75, 0x74, 0x5b, 0x31, 0x5d, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x43, 0x39, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x69, + 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x66, + 0x75, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, + 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x37, 0x5f, 0x63, 0x6e, + 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x34, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x72, + 0x74, 0x65, 0x78, 0x2d, 0x41, 0x37, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x37, + 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, + 0x75, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, + 0x67, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, + 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x37, 0x5f, 0x63, 0x63, 0x6e, + 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x66, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, + 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, + 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, + 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, + 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x73, 0x20, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x74, 0x20, + 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, + 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, + 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, + 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, + 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x61, 0x6b, + 0x65, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x4f, 0x4e, + 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, + 0x49, 0x44, 0x52, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x43, 0x20, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x65, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x64, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, + 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, + 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x32, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x64, + 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x70, 0x72, 0x65, 0x64, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x34, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x65, 0x76, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x39, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x2d, 0x20, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x75, 0x73, + 0x20, 0x2d, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x2d, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x31, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x2d, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x36, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x52, + 0x51, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x52, 0x51, 0x20, 0x65, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x49, 0x51, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x46, 0x49, 0x51, + 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x43, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x43, + 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x65, 0x78, 0x74, 0x20, 0x72, 0x65, 0x71, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x43, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x43, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, + 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x43, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x43, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x6f, + 0x64, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x43, + 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x54, + 0x4d, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x54, 0x4d, + 0x20, 0x45, 0x78, 0x74, 0x20, 0x4f, 0x75, 0x74, 0x5b, 0x30, 0x5d, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x45, 0x54, 0x4d, 0x20, 0x2d, 0x20, 0x45, 0x54, 0x4d, 0x20, + 0x45, 0x78, 0x74, 0x20, 0x4f, 0x75, 0x74, 0x5b, 0x30, 0x5d, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x43, 0x38, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x54, 0x4d, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x54, 0x4d, 0x20, + 0x45, 0x78, 0x74, 0x20, 0x4f, 0x75, 0x74, 0x5b, 0x31, 0x5d, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x45, 0x54, 0x4d, 0x20, 0x2d, 0x20, 0x45, 0x54, 0x4d, 0x20, 0x45, + 0x78, 0x74, 0x20, 0x4f, 0x75, 0x74, 0x5b, 0x31, 0x5d, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x43, 0x39, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x43, 0x41, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x6e, 0x6f, 0x6f, 0x70, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x65, 0x64, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2e, 0x20, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, + 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x61, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x73, + 0x75, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, + 0x78, 0x5f, 0x41, 0x38, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, + 0x38, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, + 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, 0x38, 0x5f, 0x63, 0x6e, 0x74, 0x22, + 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, + 0x5f, 0x41, 0x38, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, + 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, + 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x6f, 0x66, + 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, + 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, + 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, + 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, + 0x42, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x74, + 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x2d, 0x77, 0x72, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x61, 0x6b, + 0x65, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x4f, 0x4e, + 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, + 0x49, 0x44, 0x52, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x43, 0x20, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x65, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x64, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2c, 0x20, 0x6f, 0x74, + 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x2c, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, + 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, + 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x32, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x64, + 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x70, 0x72, 0x65, 0x64, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x30, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x31, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x32, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2c, 0x20, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x76, 0x69, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x73, 0x74, + 0x20, 0x6f, 0x75, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x34, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x32, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, + 0x6e, 0x79, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x35, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x41, 0x58, 0x49, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x41, 0x58, 0x49, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x34, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x41, 0x58, 0x49, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x41, + 0x58, 0x49, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, + 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, + 0x79, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x34, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x65, + 0x70, 0x6c, 0x61, 0x79, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, 0x75, + 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x61, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, + 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, 0x4c, + 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x73, + 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x61, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x73, 0x68, 0x20, 0x6d, + 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, 0x4c, 0x31, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, + 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, + 0x69, 0x74, 0x68, 0x6d, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x34, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, + 0x6e, 0x79, 0x20, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x20, 0x6f, 0x63, 0x63, 0x75, + 0x72, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4e, 0x45, 0x4f, 0x4e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x31, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x68, 0x69, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, 0x4e, 0x45, 0x4f, 0x4e, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4c, 0x31, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4e, 0x45, 0x4f, 0x4e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x31, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, 0x4e, + 0x45, 0x4f, 0x4e, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x31, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x65, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4e, 0x45, 0x4f, 0x4e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, + 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x20, 0x4e, 0x45, 0x4f, 0x4e, 0x20, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, + 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4e, 0x45, + 0x4f, 0x4e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x68, 0x69, 0x74, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x41, 0x6e, 0x79, 0x20, 0x4e, 0x45, 0x4f, 0x4e, 0x20, 0x68, 0x69, + 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, + 0x79, 0x20, 0x4c, 0x31, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x50, 0x31, 0x35, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x35, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, 0x79, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x6d, + 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x20, 0x70, 0x6f, 0x70, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x54, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, + 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6e, + 0x79, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x74, 0x61, 0x6b, + 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, + 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, + 0x6e, 0x79, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x35, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x6f, 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x73, + 0x73, 0x75, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x65, 0x69, + 0x74, 0x68, 0x65, 0x72, 0x3a, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, + 0x61, 0x6b, 0x65, 0x20, 0x75, 0x70, 0x20, 0x61, 0x20, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x36, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x72, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4e, 0x6f, 0x20, 0x69, 0x73, + 0x73, 0x75, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6e, 0x6f, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, + 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6f, + 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x73, + 0x73, 0x75, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, + 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, + 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4e, 0x45, + 0x4f, 0x4e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x52, + 0x43, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x77, 0x61, 0x69, 0x74, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x73, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x6e, 0x20, 0x4d, 0x52, 0x43, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x4e, 0x45, 0x4f, 0x4e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x39, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4e, 0x45, 0x4f, 0x4e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x75, 0x6c, 0x6c, + 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x73, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x20, 0x4e, 0x45, 0x4f, 0x4e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x4e, 0x45, 0x4f, 0x4e, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x61, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4e, 0x45, 0x4f, 0x4e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x64, 0x6c, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x4e, + 0x45, 0x4f, 0x4e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x64, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, + 0x4d, 0x55, 0x45, 0x58, 0x54, 0x49, 0x4e, 0x5b, 0x30, 0x5d, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x50, 0x4d, 0x55, + 0x45, 0x58, 0x54, 0x49, 0x4e, 0x5b, 0x30, 0x5d, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x31, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, + 0x4d, 0x55, 0x45, 0x58, 0x54, 0x49, 0x4e, 0x5b, 0x31, 0x5d, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x50, 0x4d, 0x55, + 0x45, 0x58, 0x54, 0x49, 0x4e, 0x5b, 0x31, 0x5d, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x32, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, + 0x4d, 0x55, 0x45, 0x58, 0x54, 0x49, 0x4e, 0x5b, 0x30, 0x2c, 0x31, 0x5d, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, + 0x79, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x20, 0x50, 0x4d, 0x55, 0x45, 0x58, 0x54, 0x49, + 0x4e, 0x5b, 0x30, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x50, 0x4d, 0x55, + 0x45, 0x58, 0x54, 0x49, 0x4e, 0x5b, 0x31, 0x5d, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, + 0x41, 0x39, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x3d, 0x22, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x39, 0x22, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, + 0x65, 0x78, 0x5f, 0x41, 0x39, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, + 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x76, 0x37, 0x5f, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x41, + 0x39, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x68, 0x65, + 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, + 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, + 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, + 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, + 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x74, 0x20, 0x6c, + 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, + 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, + 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x37, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x2d, 0x77, 0x72, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x54, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x61, 0x6b, + 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, + 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x4f, + 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, 0x20, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x43, + 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x62, 0x79, 0x20, + 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x2c, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, + 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x61, 0x72, 0x63, 0x68, + 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x69, + 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6d, 0x69, 0x73, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x50, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, + 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, + 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x66, + 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, + 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x34, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4a, 0x61, 0x76, 0x61, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x42, 0x79, 0x74, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x61, 0x76, 0x61, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, + 0x67, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x34, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4a, 0x61, 0x76, 0x61, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x53, 0x57, 0x20, 0x62, 0x79, 0x74, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x20, 0x6a, 0x61, 0x76, 0x61, 0x20, 0x62, 0x79, 0x74, + 0x65, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, + 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x34, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4a, + 0x61, 0x7a, 0x65, 0x6c, 0x6c, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x20, 0x62, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x4a, 0x61, 0x7a, 0x65, 0x6c, 0x6c, 0x65, 0x20, 0x74, 0x61, 0x6b, + 0x65, 0x6e, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x20, + 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x43, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x39, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, + 0x41, 0x39, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x73, 0x2c, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x31, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, + 0x68, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x20, 0x68, 0x69, 0x74, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x74, 0x65, + 0x78, 0x2d, 0x41, 0x39, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x69, 0x74, + 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x41, 0x39, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2c, 0x20, 0x6d, 0x65, 0x61, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x69, 0x73, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x65, 0x64, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, + 0x65, 0x76, 0x61, 0x6e, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x74, 0x65, 0x78, + 0x2d, 0x41, 0x39, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x70, 0x74, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x62, 0x65, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x6c, 0x79, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, + 0x67, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, + 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, 0x73, 0x6f, 0x6d, + 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x63, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, + 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x75, 0x6e, 0x69, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x74, 0x20, + 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x36, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x54, 0x4c, 0x42, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x54, 0x4c, + 0x42, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x36, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x49, 0x6e, 0x74, 0x72, 0x69, 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, 0x70, + 0x61, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x34, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x72, + 0x69, 0x6e, 0x73, 0x69, 0x63, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x53, 0x54, 0x52, 0x45, 0x58, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x53, + 0x54, 0x52, 0x45, 0x58, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, + 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x65, 0x76, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, + 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x36, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x73, 0x73, 0x75, 0x65, 0x20, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x64, 0x69, 0x73, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x73, + 0x73, 0x75, 0x65, 0x20, 0x73, 0x74, 0x61, 0x67, 0x65, 0x20, 0x64, 0x6f, + 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61, + 0x6e, 0x79, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x36, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x73, 0x73, 0x75, 0x65, 0x20, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x72, + 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x69, + 0x6e, 0x67, 0x20, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x69, 0x73, + 0x20, 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x72, 0x65, + 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x36, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x73, + 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x41, 0x58, 0x49, 0x20, 0x62, 0x75, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x41, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, + 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x73, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x65, 0x72, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x42, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x68, 0x69, 0x74, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x66, + 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x36, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x73, + 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x2c, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x37, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x69, 0x6e, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, + 0x6e, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x20, 0x70, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x72, + 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x20, 0x6c, 0x6f, 0x67, + 0x69, 0x63, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x20, 0x70, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x37, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, + 0x67, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x28, 0x41, 0x4c, 0x55, 0x29, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, + 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x52, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x67, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x34, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4e, 0x45, 0x4f, 0x4e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4e, 0x45, 0x4f, 0x4e, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x38, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x4c, 0x44, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x69, 0x73, + 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x65, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x50, 0x4c, 0x44, 0x20, 0x73, 0x6c, 0x6f, + 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, + 0x75, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x38, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x69, + 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x6f, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x69, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x38, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, + 0x69, 0x6e, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6d, + 0x61, 0x69, 0x6e, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x73, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x64, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, + 0x6c, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x73, 0x69, 0x64, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x34, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x6d, + 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x64, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x35, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x6d, + 0x69, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x20, 0x54, 0x4c, 0x42, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x73, 0x69, 0x64, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x38, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x4d, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x44, + 0x4d, 0x42, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x62, 0x61, + 0x72, 0x72, 0x69, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x41, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x20, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x69, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x42, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, + 0x63, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x38, 0x43, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4e, 0x45, 0x4f, 0x4e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x45, 0x4f, + 0x4e, 0x20, 0x53, 0x49, 0x4d, 0x44, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x54, 0x4c, 0x42, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x45, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x4c, 0x42, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x61, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x62, 0x65, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x53, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x49, 0x53, 0x42, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x31, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x53, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x53, 0x42, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x39, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x4d, 0x42, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x4d, 0x42, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x39, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x41, 0x30, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x4c, 0x45, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x72, 0x71, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x50, 0x4c, 0x45, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x41, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x50, 0x4c, 0x45, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x72, 0x71, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x50, + 0x4c, 0x45, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x73, + 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x41, 0x32, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x4c, 0x45, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x49, 0x46, 0x4f, 0x20, 0x66, 0x6c, 0x75, + 0x73, 0x68, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x50, 0x4c, 0x45, 0x20, 0x46, 0x49, 0x46, 0x4f, 0x20, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x41, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x50, 0x4c, 0x45, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x50, 0x4c, 0x45, 0x20, 0x46, 0x49, 0x46, 0x4f, + 0x20, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x41, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x50, 0x4c, 0x45, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x46, 0x49, 0x46, 0x4f, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, + 0x6c, 0x6f, 0x77, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x50, 0x4c, 0x45, 0x20, 0x46, 0x49, 0x46, 0x4f, 0x20, + 0x66, 0x6c, 0x75, 0x73, 0x68, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x41, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x50, 0x4c, 0x45, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x50, 0x4c, 0x45, 0x20, + 0x46, 0x49, 0x46, 0x4f, 0x20, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x20, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x62, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, + 0x2d, 0x20, 0x72, 0x65, 0x67, 0x65, 0x78, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x20, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x77, + 0x6e, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, + 0x2d, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x70, + 0x75, 0x31, 0x5f, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x20, 0x70, + 0x61, 0x74, 0x68, 0x3d, 0x22, 0x2f, 0x73, 0x79, 0x73, 0x2f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x2f, 0x63, 0x70, 0x75, 0x2f, 0x63, 0x70, 0x75, 0x31, 0x2f, 0x6f, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x63, 0x70, 0x75, 0x20, 0x31, 0x22, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x66, 0x20, 0x63, 0x70, 0x75, 0x20, 0x31, + 0x20, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x75, 0x69, 0x64, 0x22, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3d, + 0x22, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x6c, 0x66, 0x2f, + 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x75, 0x69, 0x64, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x75, 0x69, + 0x64, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x75, 0x69, 0x64, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x75, 0x69, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x64, 0x5f, 0x72, 0x73, 0x73, 0x22, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x3d, 0x22, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x6c, 0x66, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x72, 0x73, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, + 0x72, 0x65, 0x67, 0x65, 0x78, 0x3d, 0x22, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x20, 0x5c, 0x28, 0x2e, 0x2a, 0x5c, 0x29, 0x20, 0x2e, + 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, + 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, + 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, + 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, + 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, + 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, + 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, + 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, + 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, + 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, + 0x39, 0x5d, 0x2b, 0x20, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, + 0x20, 0x28, 0x2d, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x29, 0x22, + 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x70, 0x61, 0x67, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x20, 0x73, 0x65, 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3d, + 0x22, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x63, + 0x2d, 0x73, 0x74, 0x61, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x65, 0x22, 0x20, 0x72, 0x65, 0x67, 0x65, 0x78, 0x3d, 0x22, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x28, 0x5b, + 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x29, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x22, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x22, 0x2f, + 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x63, 0x2d, 0x73, + 0x74, 0x61, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x72, 0x65, + 0x67, 0x65, 0x78, 0x3d, 0x22, 0x63, 0x74, 0x78, 0x74, 0x20, 0x28, 0x5b, + 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x29, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, + 0x2d, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x66, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x62, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x2d, 0x2d, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x72, + 0x65, 0x67, 0x65, 0x78, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x6e, + 0x20, 0x28, 0x29, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x6e, 0x20, 0x2d, + 0x2d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x66, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x72, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x72, + 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x65, 0x22, 0x20, 0x72, 0x65, 0x67, 0x65, 0x78, 0x3d, 0x22, + 0x28, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x2b, 0x29, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, + 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x2f, 0x73, 0x79, 0x73, 0x2f, 0x6b, + 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2f, + 0x74, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x2f, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2c, 0x20, 0x65, 0x78, + 0x3a, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x34, 0x32, 0x20, 0x3e, 0x20, + 0x2f, 0x73, 0x79, 0x73, 0x2f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2f, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x69, 0x6e, + 0x67, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4b, 0x72, 0x61, 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x34, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4b, 0x72, 0x61, 0x69, 0x74, 0x22, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x4b, 0x72, 0x61, 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x22, + 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x4b, 0x72, 0x61, 0x69, 0x74, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, + 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3d, 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, + 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, + 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, + 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, + 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, + 0x54, 0x4c, 0x42, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x77, 0x72, 0x69, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, + 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, + 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, + 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x45, + 0x58, 0x54, 0x49, 0x44, 0x52, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, + 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x57, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, + 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x50, + 0x43, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x62, 0x79, + 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x2c, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x65, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, + 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x28, + 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x79, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, + 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x69, 0x73, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, + 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x50, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x72, + 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, + 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6c, 0x6f, + 0x77, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x43, 0x2d, 0x33, 0x31, 0x30, 0x5f, 0x63, + 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, + 0x43, 0x2d, 0x33, 0x31, 0x30, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x4c, 0x32, 0x43, 0x2d, + 0x33, 0x31, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, + 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x73, + 0x74, 0x4f, 0x55, 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x76, 0x69, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x43, 0x61, 0x73, 0x74, 0x4f, 0x55, 0x54, + 0x2c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x48, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x20, + 0x53, 0x75, 0x62, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x20, 0x68, 0x69, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x48, 0x69, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x68, 0x69, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x20, + 0x53, 0x75, 0x62, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x20, 0x68, 0x69, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x2d, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x2d, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, + 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2e, 0x20, + 0x53, 0x75, 0x62, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x20, 0x68, 0x69, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x48, 0x69, 0x74, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x20, + 0x53, 0x75, 0x62, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x20, 0x68, 0x69, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x41, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x4d, 0x69, 0x73, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2c, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x2d, + 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x50, + 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x4c, 0x32, 0x43, + 0x2d, 0x33, 0x31, 0x30, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x62, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x74, 0x63, 0x68, 0x20, 0x48, 0x69, 0x74, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x50, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, + 0x68, 0x69, 0x6e, 0x74, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x72, 0x65, 0x66, 0x69, 0x74, 0x63, 0x68, 0x20, + 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, + 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x68, 0x69, 0x6e, 0x74, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x70, + 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x65, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x70, 0x65, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, + 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x48, 0x69, 0x6e, 0x74, 0x20, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, + 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x68, 0x69, 0x6e, 0x74, + 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, + 0x75, 0x78, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x69, 0x72, 0x71, 0x5f, 0x73, + 0x6f, 0x66, 0x74, 0x69, 0x72, 0x71, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6f, 0x66, + 0x74, 0x49, 0x52, 0x51, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, + 0x75, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x69, 0x6e, + 0x75, 0x78, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x49, 0x52, 0x51, 0x20, 0x74, + 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x69, 0x72, + 0x71, 0x5f, 0x69, 0x72, 0x71, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x52, 0x51, 0x22, + 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x49, 0x52, + 0x51, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x71, 0x5f, 0x77, 0x72, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x69, 0x73, + 0x6b, 0x20, 0x49, 0x2f, 0x4f, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, + 0x73, 0x3d, 0x22, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x69, 0x73, 0x6b, 0x20, + 0x49, 0x2f, 0x4f, 0x20, 0x42, 0x79, 0x74, 0x65, 0x73, 0x20, 0x57, 0x72, + 0x69, 0x74, 0x74, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x71, 0x5f, 0x72, 0x64, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x69, 0x73, 0x6b, 0x20, + 0x49, 0x2f, 0x4f, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, + 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x69, 0x73, 0x6b, 0x20, 0x49, 0x2f, 0x4f, + 0x20, 0x42, 0x79, 0x74, 0x65, 0x73, 0x20, 0x52, 0x65, 0x61, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, + 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x78, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, + 0x73, 0x3d, 0x22, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x74, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x6e, 0x65, + 0x74, 0x5f, 0x74, 0x78, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, + 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x42, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x20, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x6c, 0x69, 0x6e, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, + 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x73, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, + 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x6d, 0x65, 0x6d, + 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x6d, 0x75, 0x73, 0x65, 0x64, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, + 0x73, 0x65, 0x64, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x75, 0x6e, + 0x69, 0x74, 0x73, 0x3d, 0x22, 0x42, 0x22, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x65, + 0x3a, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x27, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, + 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x28, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x52, 0x45, 0x53, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x6f, 0x70, 0x29, 0x2e, 0x20, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x6d, 0x65, 0x6d, + 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x6d, 0x75, 0x73, 0x65, 0x64, + 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x55, 0x73, 0x65, 0x64, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x75, + 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, + 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, + 0x6d, 0x66, 0x72, 0x65, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x65, 0x65, 0x22, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x65, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, + 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x22, 0x20, 0x75, 0x6e, 0x69, + 0x74, 0x73, 0x3d, 0x22, 0x42, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x6d, + 0x65, 0x6d, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6d, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x65, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x42, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x4f, 0x53, 0x20, 0x64, 0x69, 0x73, + 0x6b, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, + 0x75, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, + 0x5f, 0x66, 0x72, 0x65, 0x71, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, + 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x75, 0x6e, 0x69, + 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x73, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x22, + 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x46, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x20, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, + 0x50, 0x55, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x77, 0x61, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x50, 0x55, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x61, + 0x69, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, + 0x22, 0x6e, 0x6f, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x64, 0x65, + 0x72, 0x69, 0x76, 0x65, 0x64, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, + 0x22, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3d, 0x22, + 0x31, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x33, 0x63, 0x39, 0x36, 0x66, 0x62, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, + 0x72, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x62, 0x75, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x43, 0x50, 0x55, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, + 0x75, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, + 0x69, 0x6f, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x50, 0x55, 0x20, 0x49, 0x2f, 0x4f, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x57, 0x61, 0x69, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, + 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, + 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, + 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x62, 0x33, + 0x30, 0x30, 0x30, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4f, 0x6e, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x49, 0x2f, 0x4f, + 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x4c, 0x69, 0x6e, + 0x75, 0x78, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x50, 0x55, + 0x20, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x31, 0x3d, 0x22, 0x4f, 0x66, 0x66, 0x22, 0x20, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x31, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x66, 0x66, 0x30, + 0x30, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x32, + 0x3d, 0x22, 0x57, 0x46, 0x49, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x32, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x66, 0x66, 0x22, 0x20, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, + 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, + 0x50, 0x55, 0x20, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x5f, 0x56, 0x50, 0x5f, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, + 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, + 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, + 0x56, 0x50, 0x5f, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, 0x65, + 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x70, + 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4d, 0x61, 0x6c, 0x69, 0x47, 0x50, 0x32, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, + 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, + 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x20, 0x77, + 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x74, + 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x76, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x74, + 0x65, 0x78, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x75, 0x6e, + 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, + 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x77, 0x61, 0x73, 0x20, 0x69, 0x64, + 0x6c, 0x65, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x69, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, + 0x72, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x6f, 0x72, 0x64, + 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x20, 0x62, 0x75, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x36, 0x34, 0x20, 0x62, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, + 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x47, 0x50, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x62, 0x75, + 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x2c, 0x20, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x20, 0x62, 0x75, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x36, 0x34, 0x20, 0x62, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x72, + 0x64, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x62, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x50, 0x32, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, + 0x62, 0x75, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x62, 0x75, 0x72, 0x73, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x20, 0x62, 0x75, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x62, 0x75, 0x72, 0x73, 0x74, 0x73, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x47, 0x50, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x62, + 0x75, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x62, 0x75, 0x72, 0x73, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x20, 0x62, 0x75, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x62, 0x75, 0x72, 0x73, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x69, 0x47, 0x50, + 0x32, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x20, 0x62, 0x75, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, + 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x63, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6c, + 0x69, 0x47, 0x50, 0x32, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, + 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x65, 0x72, + 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x69, 0x47, 0x50, 0x32, 0x20, 0x70, 0x65, + 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x69, + 0x47, 0x50, 0x32, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x63, 0x75, 0x6c, 0x6c, 0x65, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x70, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x64, 0x69, + 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x20, 0x70, 0x65, 0x72, 0x20, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x77, 0x65, 0x72, 0x65, + 0x20, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x77, + 0x65, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x63, 0x72, 0x65, 0x65, + 0x6e, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x28, 0x38, 0x20, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x6c, 0x79, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x29, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x47, + 0x50, 0x32, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x50, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x70, 0x65, + 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x6e, + 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x50, 0x50, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x27, 0x73, 0x20, 0x76, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x75, + 0x6e, 0x69, 0x74, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x76, + 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x47, 0x50, 0x32, 0x20, 0x76, 0x65, 0x72, 0x74, + 0x65, 0x78, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, + 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, + 0x65, 0x6d, 0x61, 0x70, 0x68, 0x6f, 0x72, 0x65, 0x73, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x37, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x50, 0x4c, 0x42, 0x55, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x69, 0x47, 0x50, 0x32, 0x20, 0x50, + 0x4c, 0x42, 0x55, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x77, 0x61, + 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x20, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, + 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6d, 0x61, 0x70, 0x68, 0x6f, + 0x72, 0x65, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, + 0x56, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x2c, + 0x20, 0x50, 0x4c, 0x42, 0x55, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x69, 0x47, 0x50, 0x32, 0x20, 0x50, + 0x4c, 0x42, 0x55, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x75, + 0x6e, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x73, + 0x70, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x50, 0x4c, 0x42, + 0x55, 0x20, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x69, 0x47, + 0x50, 0x32, 0x20, 0x50, 0x4c, 0x42, 0x55, 0x20, 0x77, 0x61, 0x73, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, + 0x20, 0x49, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x77, 0x6f, + 0x72, 0x64, 0x73, 0x3a, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, + 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, + 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x50, + 0x4c, 0x42, 0x55, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x73, + 0x70, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4d, 0x61, 0x6c, 0x69, 0x47, 0x50, 0x32, 0x20, 0x50, 0x4c, 0x42, 0x55, + 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, + 0x79, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x20, 0x73, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, + 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x50, 0x4c, + 0x42, 0x55, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x69, 0x47, + 0x50, 0x32, 0x20, 0x50, 0x4c, 0x42, 0x55, 0x20, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, + 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x56, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x6f, 0x78, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x70, + 0x65, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, + 0x61, 0x6c, 0x69, 0x47, 0x50, 0x32, 0x20, 0x50, 0x4c, 0x42, 0x55, 0x20, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x6f, 0x78, 0x65, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x20, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x6c, 0x79, 0x20, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x70, 0x72, 0x69, 0x6d, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x29, 0x2e, 0x20, 0x54, 0x68, 0x69, + 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x75, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x20, 0x56, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x2c, 0x20, 0x53, 0x63, 0x69, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x74, 0x69, + 0x6c, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, + 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4d, 0x61, 0x6c, 0x69, 0x47, 0x50, 0x32, 0x20, 0x50, 0x4c, 0x42, + 0x55, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x63, + 0x69, 0x73, 0x73, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, + 0x74, 0x69, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, 0x77, + 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x75, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x31, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, + 0x78, 0x20, 0x56, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x2c, 0x20, 0x50, 0x4c, 0x42, 0x55, 0x20, 0x74, 0x69, 0x6c, 0x65, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x70, 0x65, 0x72, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x70, + 0x65, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, + 0x61, 0x6c, 0x69, 0x47, 0x50, 0x32, 0x20, 0x50, 0x4c, 0x42, 0x55, 0x20, + 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x76, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x6f, 0x78, 0x20, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x20, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x6c, 0x79, + 0x20, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x29, 0x2e, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, + 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, + 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, + 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x46, 0x50, + 0x5f, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, + 0x46, 0x50, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x47, + 0x50, 0x55, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x30, 0x22, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x5f, 0x46, 0x50, 0x5f, 0x31, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x20, 0x46, 0x50, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x47, 0x50, 0x55, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x20, 0x31, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x5f, 0x46, 0x50, 0x5f, 0x32, 0x5f, 0x63, 0x6e, 0x74, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x32, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x47, 0x50, 0x55, 0x20, 0x46, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x20, 0x32, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x3d, 0x22, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x46, 0x50, 0x5f, 0x33, 0x5f, + 0x63, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x33, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x47, 0x50, 0x55, 0x20, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x33, 0x22, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, + 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x46, 0x50, + 0x5f, 0x34, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, + 0x46, 0x50, 0x34, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x47, + 0x50, 0x55, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x34, 0x22, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x5f, 0x46, 0x50, 0x5f, 0x35, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x20, 0x46, 0x50, 0x35, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x47, 0x50, 0x55, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x20, 0x35, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x5f, 0x46, 0x50, 0x5f, 0x36, 0x5f, 0x63, 0x6e, 0x74, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x36, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x47, 0x50, 0x55, 0x20, 0x46, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x20, 0x36, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x3d, 0x22, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x46, 0x50, 0x5f, 0x37, 0x5f, + 0x63, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x37, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x47, 0x50, 0x55, 0x20, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x37, 0x22, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, + 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, + 0x65, 0x6e, 0x20, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x52, 0x51, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x20, 0x62, 0x75, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, + 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x62, 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, + 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, + 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x77, 0x61, 0x73, 0x20, 0x48, + 0x49, 0x47, 0x48, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, + 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x75, + 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, + 0x77, 0x61, 0x73, 0x20, 0x48, 0x49, 0x47, 0x48, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x36, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x70, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x75, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, + 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x54, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x77, 0x6f, + 0x72, 0x64, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x20, 0x62, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x61, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x75, 0x6e, 0x69, + 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x36, + 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x74, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x63, + 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x77, + 0x6f, 0x72, 0x64, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x20, 0x69, + 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x63, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, + 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, + 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x53, 0x57, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x77, 0x6f, + 0x72, 0x64, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x20, 0x69, 0x6e, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x57, 0x6f, 0x72, 0x64, + 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x36, + 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x75, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, + 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x36, 0x34, + 0x2d, 0x62, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x75, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x72, + 0x65, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, + 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, + 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x20, + 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x31, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, + 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x61, 0x72, + 0x79, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x36, + 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x76, + 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, + 0x72, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x36, 0x34, 0x2d, + 0x62, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x20, + 0x72, 0x65, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x77, + 0x6f, 0x72, 0x64, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x20, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x37, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, + 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x4f, 0x41, 0x44, + 0x20, 0x73, 0x75, 0x62, 0x2d, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, + 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x69, 0x78, 0x65, + 0x6c, 0x20, 0x72, 0x65, 0x63, 0x74, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, + 0x72, 0x65, 0x63, 0x74, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, + 0x73, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x6c, + 0x79, 0x67, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x63, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x20, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x20, + 0x4c, 0x69, 0x73, 0x74, 0x20, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, + 0x77, 0x61, 0x69, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x64, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, + 0x65, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x54, 0x53, 0x43, 0x20, 0x77, 0x61, 0x69, 0x74, 0x65, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x65, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x20, 0x72, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x32, 0x78, 0x3f, 0x32, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, + 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x72, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x72, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, + 0x64, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, + 0x7a, 0x65, 0x64, 0x2e, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x28, 0x51, 0x75, 0x61, 0x64, 0x73, 0x2a, 0x34, 0x29, + 0x20, 0x67, 0x69, 0x76, 0x65, 0x73, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, + 0x71, 0x75, 0x61, 0x64, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x6a, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x2d, 0x6b, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, + 0x78, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x61, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x32, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x66, 0x77, 0x64, 0x2d, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x2d, 0x6b, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6b, + 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x66, 0x6f, 0x72, + 0x77, 0x61, 0x72, 0x64, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x32, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x61, + 0x73, 0x73, 0x65, 0x64, 0x20, 0x7a, 0x2f, 0x73, 0x74, 0x65, 0x6e, 0x63, + 0x69, 0x6c, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x5a, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x65, + 0x6e, 0x63, 0x69, 0x6c, 0x20, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x33, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, + 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x61, 0x72, + 0x6c, 0x79, 0x20, 0x7a, 0x2f, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x69, 0x6c, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x20, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x45, 0x61, 0x72, 0x6c, 0x79, 0x5a, 0x2e, 0x20, 0x41, + 0x20, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, + 0x65, 0x20, 0x38, 0x78, 0x38, 0x2c, 0x20, 0x34, 0x78, 0x34, 0x20, 0x6f, + 0x72, 0x20, 0x32, 0x78, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x32, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x65, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x45, + 0x61, 0x72, 0x6c, 0x79, 0x5a, 0x20, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x32, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, + 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, + 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x49, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, + 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x32, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x7a, 0x76, 0x6f, 0x75, + 0x73, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x52, 0x65, 0x6e, + 0x64, 0x65, 0x7a, 0x76, 0x6f, 0x75, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x37, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, + 0x79, 0x69, 0x6e, 0x67, 0x2d, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x62, + 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, + 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2d, 0x6d, 0x69, 0x73, 0x73, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x32, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x2d, 0x6d, 0x69, 0x73, 0x73, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, + 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, + 0x74, 0x69, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x6d, 0x69, + 0x73, 0x73, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x69, 0x6c, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, + 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2d, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x63, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x7a, 0x76, 0x6f, + 0x75, 0x73, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x61, 0x67, 0x65, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x7a, + 0x76, 0x6f, 0x75, 0x73, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x61, 0x67, + 0x65, 0x73, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x32, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x75, + 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x32, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x20, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6c, 0x6f, + 0x6f, 0x70, 0x65, 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x20, + 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x66, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x70, + 0x70, 0x65, 0x72, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, + 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x68, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x77, + 0x61, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x28, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x68, 0x69, + 0x74, 0x73, 0x29, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x33, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, + 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, + 0x69, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x77, + 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x29, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x32, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x68, 0x69, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, + 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x61, 0x73, 0x20, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x29, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x33, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, + 0x67, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, + 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x29, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x34, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, + 0x74, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x79, 0x69, + 0x6e, 0x67, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x2c, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x6c, 0x64, 0x65, + 0x72, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x68, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, + 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x68, 0x69, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x61, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, + 0x65, 0x78, 0x65, 0x6c, 0x20, 0x77, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x75, + 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x68, 0x69, 0x74, 0x73, 0x29, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x36, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x65, 0x78, 0x65, + 0x6c, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x29, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x37, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x65, 0x78, 0x65, + 0x6c, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2c, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x6c, 0x64, 0x65, 0x72, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x38, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x64, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x68, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x20, 0x77, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x33, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, + 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x61, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x68, 0x69, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x2f, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x33, + 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, + 0x73, 0x73, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x33, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, + 0x46, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x68, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x68, 0x69, + 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x33, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x20, 0x4c, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x47, 0x50, 0x55, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x30, 0x22, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x20, 0x4c, 0x32, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x4c, 0x32, 0x5f, + 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, + 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, + 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x61, 0x76, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x61, 0x76, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x30, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x30, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x30, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x30, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x33, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x34, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, + 0x76, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x6c, 0x6c, + 0x20, 0x73, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6c, + 0x6c, 0x20, 0x73, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x30, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x31, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x31, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x32, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x32, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x33, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x33, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x34, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x34, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x41, 0x6c, 0x6c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x6f, 0x72, + 0x64, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x6f, + 0x72, 0x64, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x41, 0x6c, 0x6c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x6f, 0x72, + 0x64, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, + 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x73, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x68, + 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x68, + 0x69, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, + 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x36, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x53, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x37, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x69, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, + 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x4c, 0x32, 0x5f, + 0x31, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x4c, + 0x32, 0x20, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x47, + 0x50, 0x55, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x43, 0x6f, 0x72, 0x65, 0x20, 0x31, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x3d, 0x22, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x4c, + 0x32, 0x5f, 0x31, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x31, 0x5f, + 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, + 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x6c, 0x6c, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x61, 0x76, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x61, + 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x32, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x20, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x33, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x20, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x34, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x20, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x35, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x20, 0x33, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x20, 0x34, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, + 0x65, 0x20, 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, + 0x78, 0x31, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, + 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x41, 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x30, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x30, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x30, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x30, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x31, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x31, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x30, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x32, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x32, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x30, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x33, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x33, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x34, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x34, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x31, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x41, 0x6c, 0x6c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x32, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x31, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x31, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x6f, 0x72, 0x64, 0x73, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, + 0x6f, 0x72, 0x64, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x34, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x31, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x68, + 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x68, + 0x69, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, + 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x36, + 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x31, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x69, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x37, 0x22, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, + 0x76, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x31, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x69, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, + 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x31, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x32, 0x5f, 0x63, 0x6e, + 0x74, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x4c, 0x32, 0x20, 0x32, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x47, 0x50, 0x55, 0x20, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x65, + 0x20, 0x32, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x32, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x4c, 0x32, 0x5f, 0x32, 0x22, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x32, 0x5f, 0x63, 0x6e, 0x74, 0x22, + 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x41, 0x6c, 0x6c, 0x20, 0x73, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x32, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x30, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x31, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x32, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x33, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x33, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, + 0x34, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x34, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, + 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x20, 0x73, + 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x20, + 0x73, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, + 0x22, 0x30, 0x78, 0x32, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x30, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, + 0x22, 0x30, 0x78, 0x33, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x31, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x20, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, + 0x22, 0x30, 0x78, 0x34, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x32, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x20, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, + 0x22, 0x30, 0x78, 0x35, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x33, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x20, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, + 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x20, 0x34, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, + 0x6c, 0x61, 0x76, 0x65, 0x20, 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x32, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, + 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x33, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x41, 0x6c, 0x6c, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x74, 0x65, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x6f, 0x72, 0x64, 0x73, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x53, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x35, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x32, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x69, + 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x36, 0x22, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x37, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x73, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x32, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, 0x6c, + 0x61, 0x76, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x5f, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x63, + 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x31, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x20, 0x46, 0x69, 0x6c, 0x6d, 0x73, + 0x74, 0x72, 0x69, 0x70, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x46, 0x69, 0x6c, 0x6d, + 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, + 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, + 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x33, 0x63, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x31, 0x3a, 0x36, 0x30, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x65, + 0x76, 0x65, 0x72, 0x79, 0x20, 0x36, 0x30, 0x74, 0x68, 0x20, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, + 0x31, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x31, 0x3a, + 0x33, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x33, 0x30, 0x74, 0x68, + 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, + 0x22, 0x30, 0x78, 0x61, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x31, 0x3a, 0x31, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x63, 0x61, 0x70, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x31, 0x30, + 0x74, 0x68, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x34, 0x30, 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x66, 0x73, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x20, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x74, 0x72, 0x69, 0x70, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x56, 0x6f, + 0x6c, 0x74, 0x61, 0x67, 0x65, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, + 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x56, 0x6f, 0x6c, 0x74, 0x61, 0x67, + 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x47, 0x50, 0x55, 0x20, 0x56, 0x6f, 0x6c, 0x74, 0x61, + 0x67, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x6f, + 0x6c, 0x74, 0x61, 0x67, 0x65, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, + 0x22, 0x6d, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x47, 0x50, 0x55, 0x20, 0x63, 0x6f, + 0x72, 0x65, 0x20, 0x76, 0x6f, 0x6c, 0x74, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, + 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x20, 0x70, + 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x46, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x47, 0x50, 0x55, + 0x20, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3d, 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x75, + 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x4d, 0x48, 0x7a, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x47, 0x50, 0x55, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x66, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x5f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x47, 0x50, 0x55, + 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x31, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x30, 0x30, 0x30, 0x36, 0x66, 0x63, 0x63, 0x22, 0x20, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, + 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x47, 0x50, 0x55, + 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x47, 0x50, + 0x55, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x31, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x30, 0x65, 0x64, 0x61, 0x30, 0x30, 0x30, 0x22, 0x20, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x47, 0x50, 0x55, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x34, 0x78, 0x78, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, + 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x22, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, + 0x5f, 0x53, 0x57, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, + 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x45, 0x47, 0x4c, 0x20, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x2d, 0x2d, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, + 0x5f, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x45, 0x47, 0x4c, 0x20, 0x53, 0x6f, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x6c, 0x69, + 0x74, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x69, 0x6d, + 0x65, 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x6c, 0x69, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x20, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, + 0x77, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x31, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x67, 0x6c, 0x44, + 0x72, 0x61, 0x77, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x32, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x67, 0x6c, 0x44, 0x72, + 0x61, 0x77, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, + 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, + 0x5f, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x67, + 0x6c, 0x44, 0x72, 0x61, 0x77, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x67, + 0x6c, 0x44, 0x72, 0x61, 0x77, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x73, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x34, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, + 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, + 0x44, 0x72, 0x61, 0x77, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, 0x72, + 0x61, 0x77, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, + 0x5f, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x67, + 0x6c, 0x44, 0x72, 0x61, 0x77, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x20, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x67, 0x6c, 0x44, + 0x72, 0x61, 0x77, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x67, 0x6c, + 0x44, 0x72, 0x61, 0x77, 0x41, 0x72, 0x72, 0x61, 0x79, 0x73, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, + 0x44, 0x72, 0x61, 0x77, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x36, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x72, 0x61, + 0x77, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, 0x2a, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x47, 0x4c, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, + 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x44, 0x72, 0x61, 0x77, 0x63, 0x61, 0x6c, 0x6c, 0x20, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, + 0x72, 0x61, 0x77, 0x2a, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x47, 0x4c, 0x5f, 0x4c, + 0x49, 0x4e, 0x45, 0x53, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x38, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x72, 0x61, 0x77, 0x63, + 0x61, 0x6c, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, + 0x6e, 0x65, 0x6c, 0x6f, 0x6f, 0x70, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, 0x2a, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x47, 0x4c, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x4c, + 0x4f, 0x4f, 0x50, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x39, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x72, 0x61, 0x77, 0x63, 0x61, + 0x6c, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, + 0x65, 0x73, 0x74, 0x72, 0x69, 0x70, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, 0x2a, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x47, 0x4c, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x53, + 0x54, 0x52, 0x49, 0x50, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x31, 0x30, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x72, 0x61, 0x77, + 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, + 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, 0x77, + 0x2a, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x47, 0x4c, 0x5f, 0x54, 0x52, 0x49, 0x41, + 0x4e, 0x47, 0x4c, 0x45, 0x53, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x31, 0x31, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x72, 0x61, + 0x77, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x54, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x74, 0x72, 0x69, + 0x70, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x67, + 0x6c, 0x44, 0x72, 0x61, 0x77, 0x2a, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x47, 0x4c, + 0x5f, 0x54, 0x52, 0x49, 0x41, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x53, 0x54, + 0x52, 0x49, 0x50, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x31, 0x32, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x72, 0x61, 0x77, 0x63, + 0x61, 0x6c, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, + 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x66, 0x61, 0x6e, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61, + 0x6c, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x44, 0x72, 0x61, + 0x77, 0x2a, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x47, 0x4c, 0x5f, 0x54, 0x52, 0x49, + 0x41, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x46, 0x41, 0x4e, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, + 0x57, 0x5f, 0x31, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x44, 0x72, 0x61, 0x77, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, + 0x75, 0x73, 0x29, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x73, + 0x70, 0x65, 0x6e, 0x74, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x66, 0x61, 0x63, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x56, 0x42, 0x4f, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, + 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x31, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x44, 0x72, 0x61, 0x77, 0x63, 0x61, 0x6c, 0x6c, + 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x69, 0x66, 0x6f, + 0x72, 0x6d, 0x20, 0x42, 0x79, 0x74, 0x65, 0x73, 0x20, 0x43, 0x6f, 0x70, + 0x69, 0x65, 0x64, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, + 0x72, 0x6d, 0x73, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x73, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x31, 0x35, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, + 0x20, 0x28, 0x6d, 0x73, 0x29, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x69, 0x6d, 0x65, + 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x31, 0x36, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x42, 0x4f, 0x20, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x6d, 0x73, + 0x29, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, + 0x6e, 0x74, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, + 0x53, 0x57, 0x5f, 0x31, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x46, 0x42, 0x4f, 0x20, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x64, 0x20, 0x6f, 0x6e, + 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, + 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x47, 0x4c, 0x20, 0x45, 0x53, 0x20, 0x31, + 0x2e, 0x31, 0x20, 0x45, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, + 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x31, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x46, 0x69, 0x78, 0x65, 0x64, 0x2d, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x23, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x53, 0x68, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x31, 0x39, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x2d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x23, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, + 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, + 0x33, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x47, + 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x54, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, + 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x47, 0x4c, 0x45, 0x53, 0x20, 0x70, + 0x65, 0x72, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, + 0x5f, 0x33, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x20, 0x54, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x20, 0x70, + 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x47, 0x4c, 0x45, + 0x53, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x47, 0x4c, 0x5f, 0x54, 0x52, 0x49, 0x41, + 0x4e, 0x47, 0x4c, 0x45, 0x53, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x33, 0x35, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x47, 0x65, 0x6f, + 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x53, 0x74, 0x72, 0x69, 0x70, 0x20, 0x54, 0x72, 0x69, 0x61, 0x6e, 0x67, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, + 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x47, 0x4c, 0x45, 0x53, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x47, 0x4c, 0x5f, 0x54, + 0x52, 0x49, 0x41, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, + 0x50, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, + 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x33, 0x36, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, + 0x79, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x61, 0x6e, 0x20, + 0x54, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, + 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x47, 0x4c, 0x45, 0x53, 0x20, 0x75, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x20, 0x47, 0x4c, 0x5f, 0x54, 0x52, 0x49, 0x41, 0x4e, 0x47, 0x4c, + 0x45, 0x5f, 0x46, 0x41, 0x4e, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x33, 0x37, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x47, 0x65, 0x6f, + 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, + 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x47, 0x4c, + 0x45, 0x53, 0x20, 0x70, 0x65, 0x72, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, + 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x33, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, + 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x47, 0x4c, 0x45, 0x53, 0x20, 0x75, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x20, 0x47, 0x4c, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x53, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, + 0x57, 0x5f, 0x33, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x47, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x74, 0x72, 0x69, 0x70, 0x20, 0x4c, 0x69, + 0x6e, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x70, 0x61, + 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x47, 0x4c, 0x45, 0x53, + 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x20, 0x47, 0x4c, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, + 0x53, 0x54, 0x52, 0x49, 0x50, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x34, 0x78, 0x78, 0x5f, 0x53, 0x57, 0x5f, 0x34, 0x30, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x47, 0x65, 0x6f, + 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x47, 0x4c, 0x45, 0x53, 0x20, 0x75, 0x73, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x47, + 0x4c, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x4c, 0x4f, 0x4f, 0x50, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, + 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, + 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, + 0x67, 0x61, 0x72, 0x64, 0x5f, 0x47, 0x50, 0x55, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x47, 0x50, 0x55, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x50, 0x55, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x49, 0x52, 0x51, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, + 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x52, 0x51, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x47, 0x50, 0x55, 0x20, 0x68, 0x61, 0x64, 0x20, 0x61, 0x20, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, + 0x75, 0x70, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4a, 0x53, 0x30, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, + 0x30, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x4a, 0x53, 0x30, 0x20, 0x28, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4a, 0x53, + 0x31, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, + 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4a, 0x53, 0x31, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x4a, 0x53, 0x31, 0x20, 0x28, 0x76, + 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x74, 0x69, 0x6c, 0x65, 0x72, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x4a, 0x53, 0x32, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, + 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4a, 0x53, 0x32, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x4a, 0x53, 0x32, 0x20, + 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x29, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4a, 0x53, 0x30, 0x5f, + 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x30, 0x20, 0x6a, 0x6f, + 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, 0x20, 0x28, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x30, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, + 0x61, 0x72, 0x64, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x54, 0x41, 0x53, 0x4b, + 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x30, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x30, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, + 0x61, 0x72, 0x64, 0x5f, 0x4a, 0x53, 0x31, 0x5f, 0x4a, 0x4f, 0x42, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4a, 0x53, 0x31, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4a, + 0x6f, 0x62, 0x73, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, + 0x74, 0x69, 0x6c, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x4a, 0x53, 0x31, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, + 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, + 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, + 0x53, 0x31, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x4a, 0x53, 0x32, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, + 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, + 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, + 0x53, 0x32, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x4a, 0x53, 0x32, 0x5f, 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, + 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, + 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, + 0x32, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, 0x20, + 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x32, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, + 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x4f, 0x4c, 0x59, + 0x47, 0x4f, 0x4e, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, + 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x73, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, + 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x54, + 0x52, 0x49, 0x41, 0x4e, 0x47, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, + 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x69, 0x61, + 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x49, 0x4e, 0x45, + 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, + 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, + 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x4f, 0x4e, 0x54, 0x5f, 0x46, + 0x41, 0x43, 0x49, 0x4e, 0x47, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, + 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, + 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x43, 0x49, + 0x4e, 0x47, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, + 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x42, 0x61, 0x63, 0x6b, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, + 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, + 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x52, + 0x49, 0x4d, 0x5f, 0x56, 0x49, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x52, + 0x49, 0x4d, 0x5f, 0x43, 0x55, 0x4c, 0x4c, 0x45, 0x44, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x75, 0x6c, 0x6c, + 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x75, 0x6c, + 0x6c, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x5f, + 0x43, 0x4c, 0x49, 0x50, 0x50, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x69, 0x70, 0x70, 0x65, + 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x69, 0x70, + 0x70, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, + 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, + 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x30, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x32, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, + 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, + 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, + 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, + 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x33, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x34, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x34, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x35, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x35, + 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, + 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x35, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, + 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, + 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x36, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x37, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x37, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x31, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x50, 0x72, 0x69, 0x6d, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x31, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x69, 0x6e, 0x67, 0x20, 0x31, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, + 0x44, 0x5f, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x32, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x32, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x43, 0x4f, + 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x33, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x33, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x34, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, + 0x72, 0x69, 0x6d, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x34, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, + 0x6e, 0x67, 0x20, 0x34, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, + 0x44, 0x5f, 0x34, 0x5f, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x34, 0x2d, 0x37, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, + 0x34, 0x2d, 0x37, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, + 0x67, 0x61, 0x72, 0x64, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, + 0x5f, 0x35, 0x5f, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x35, 0x2d, 0x37, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x35, + 0x2d, 0x37, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, + 0x61, 0x72, 0x64, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, + 0x38, 0x5f, 0x31, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x38, 0x2d, 0x31, 0x35, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, + 0x38, 0x2d, 0x31, 0x35, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, + 0x44, 0x5f, 0x31, 0x36, 0x5f, 0x36, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x31, 0x36, 0x2d, 0x36, 0x33, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x69, 0x6e, 0x67, 0x20, 0x31, 0x36, 0x2d, 0x36, 0x33, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x43, + 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x36, 0x34, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, + 0x6d, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x26, 0x67, 0x74, 0x3b, 0x3d, 0x20, + 0x36, 0x34, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x26, 0x67, 0x74, + 0x3b, 0x3d, 0x20, 0x36, 0x34, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, + 0x72, 0x65, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, + 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x54, 0x52, 0x49, 0x50, 0x49, + 0x50, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, + 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x69, 0x70, 0x69, 0x70, + 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x72, 0x69, 0x70, + 0x69, 0x70, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, + 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x61, + 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, + 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x76, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x5c, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x43, 0x59, 0x43, 0x4c, + 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4c, 0x45, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, + 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x69, + 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x73, 0x70, + 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, + 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, + 0x65, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x44, 0x55, 0x4d, 0x4d, + 0x59, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, + 0x6f, 0x72, 0x65, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x75, 0x6d, 0x6d, 0x79, + 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, + 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, + 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x51, 0x55, + 0x41, 0x44, 0x53, 0x5f, 0x4c, 0x5a, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, + 0x61, 0x67, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x64, + 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, + 0x6e, 0x67, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x20, 0x74, + 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, + 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, 0x4c, 0x5a, 0x53, 0x5f, 0x4b, + 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x20, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x20, 0x74, 0x65, 0x73, + 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, + 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, 0x5f, 0x4c, 0x5a, 0x53, 0x5f, 0x54, + 0x45, 0x53, 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x46, 0x72, 0x61, 0x67, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x5a, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, + 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, + 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, + 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, 0x5f, + 0x4c, 0x5a, 0x53, 0x5f, 0x4b, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x43, 0x6f, 0x72, 0x65, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, + 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, + 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x43, + 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x43, 0x4f, 0x4d, + 0x50, 0x55, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, + 0x67, 0x61, 0x72, 0x64, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, + 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x5f, 0x44, 0x45, 0x53, 0x43, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x41, + 0x54, 0x49, 0x56, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, + 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x41, 0x54, + 0x49, 0x56, 0x45, 0x53, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x50, 0x45, 0x44, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x64, + 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, + 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, + 0x50, 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, 0x45, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x69, 0x6c, 0x65, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x50, + 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, 0x45, 0x53, 0x5f, 0x44, 0x52, + 0x4f, 0x50, 0x50, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x64, 0x72, 0x6f, + 0x70, 0x70, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, + 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x46, 0x52, 0x41, 0x47, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, 0x52, + 0x41, 0x53, 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, 0x72, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, + 0x73, 0x20, 0x72, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, + 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x51, 0x55, + 0x41, 0x44, 0x53, 0x5f, 0x45, 0x5a, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x51, + 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, + 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, 0x53, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, + 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x61, 0x72, + 0x6c, 0x79, 0x20, 0x5a, 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x51, 0x55, 0x41, 0x44, + 0x53, 0x5f, 0x45, 0x5a, 0x53, 0x5f, 0x4b, 0x49, 0x4c, 0x4c, 0x45, 0x44, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x51, + 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, + 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, 0x53, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, + 0x4e, 0x55, 0x4d, 0x5f, 0x54, 0x49, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x69, 0x6c, + 0x65, 0x73, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x5f, 0x45, 0x4c, 0x49, 0x4d, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x69, + 0x6c, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x6b, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x54, 0x45, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x69, 0x6c, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x73, + 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6c, + 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x41, 0x52, 0x49, 0x54, 0x48, 0x5f, 0x57, 0x4f, 0x52, 0x44, + 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x41, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, + 0x63, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x41, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x20, 0x28, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x70, 0x65, + 0x72, 0x20, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, + 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x53, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x53, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, + 0x53, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, + 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x53, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x53, + 0x2d, 0x70, 0x69, 0x70, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x54, 0x45, 0x58, 0x5f, 0x57, 0x4f, + 0x52, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x54, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x2d, + 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x54, 0x45, 0x58, + 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, + 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x73, 0x73, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x2d, 0x70, 0x69, 0x70, + 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x54, 0x45, 0x58, 0x5f, 0x52, 0x45, 0x43, 0x49, 0x52, 0x43, + 0x5f, 0x46, 0x4d, 0x49, 0x53, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, + 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x54, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x64, 0x75, + 0x65, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, + 0x69, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x53, 0x43, 0x5f, + 0x52, 0x45, 0x41, 0x44, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, + 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, + 0x53, 0x43, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4d, 0x49, 0x53, 0x53, + 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x53, 0x43, 0x5f, + 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, + 0x4d, 0x49, 0x53, 0x53, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x41, 0x54, 0x4f, 0x4d, 0x49, 0x43, + 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x74, 0x6f, 0x6d, 0x69, + 0x63, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, + 0x63, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, + 0x53, 0x43, 0x5f, 0x41, 0x54, 0x4f, 0x4d, 0x49, 0x43, 0x5f, 0x4d, 0x49, + 0x53, 0x53, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x6f, 0x6d, + 0x69, 0x63, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x46, + 0x45, 0x54, 0x43, 0x48, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x44, 0x49, 0x52, 0x54, 0x59, 0x5f, + 0x4c, 0x49, 0x4e, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x69, 0x72, 0x74, 0x79, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x64, 0x69, 0x72, 0x74, 0x79, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, + 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x53, 0x4e, 0x4f, 0x4f, + 0x50, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x4c, 0x53, 0x43, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x68, + 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x20, 0x4c, + 0x32, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x4d, 0x4d, 0x55, 0x22, 0x20, 0x70, + 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x4c, 0x32, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x42, + 0x45, 0x41, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x62, 0x65, 0x61, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x62, 0x65, 0x61, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x4c, 0x32, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x45, 0x41, 0x54, + 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, 0x65, 0x61, + 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, + 0x62, 0x75, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, 0x65, 0x61, + 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x32, 0x5f, 0x52, 0x45, + 0x41, 0x44, 0x5f, 0x53, 0x4e, 0x4f, 0x4f, 0x50, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x32, 0x5f, 0x52, 0x45, 0x41, + 0x44, 0x5f, 0x48, 0x49, 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, + 0x32, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x68, 0x69, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x32, + 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x53, 0x4e, 0x4f, 0x4f, 0x50, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x4c, 0x32, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x48, 0x49, 0x54, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x73, 0x20, 0x68, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, + 0x54, 0x5f, 0x41, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x20, 0x62, 0x75, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x20, + 0x28, 0x41, 0x52, 0x29, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x28, 0x41, 0x52, + 0x29, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x32, + 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x57, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x73, 0x20, 0x28, 0x57, 0x29, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x28, 0x57, 0x20, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x20, + 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, + 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x54, 0x4f, + 0x54, 0x41, 0x4c, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x43, 0x5f, 0x50, 0x41, + 0x47, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x41, + 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x50, 0x61, 0x67, 0x65, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x73, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, + 0x64, 0x65, 0x72, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, + 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x4d, 0x5f, 0x53, + 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x30, 0x22, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, + 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x30, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, + 0x64, 0x65, 0x72, 0x3a, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x30, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x5f, 0x50, 0x4d, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, + 0x5f, 0x31, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, + 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, + 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x53, + 0x68, 0x61, 0x64, 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, + 0x6f, 0x72, 0x65, 0x20, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x3a, 0x20, + 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, + 0x72, 0x65, 0x20, 0x31, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x4d, + 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x32, 0x22, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x65, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, + 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x4d, 0x20, 0x53, + 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x32, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x53, + 0x68, 0x61, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x32, 0x2e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, + 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x4d, 0x5f, 0x53, 0x48, 0x41, 0x44, + 0x45, 0x52, 0x5f, 0x33, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, + 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x33, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, + 0x3a, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, + 0x43, 0x6f, 0x72, 0x65, 0x20, 0x33, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x50, 0x4d, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x34, 0x22, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3d, 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, + 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, + 0x79, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x4d, + 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, + 0x20, 0x34, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, + 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x50, 0x4d, 0x20, + 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, + 0x34, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x4d, 0x5f, 0x53, 0x48, + 0x41, 0x44, 0x45, 0x52, 0x5f, 0x35, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, + 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, + 0x65, 0x72, 0x3a, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, + 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x50, 0x4d, 0x5f, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, + 0x36, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, + 0x72, 0x65, 0x20, 0x36, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x50, + 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, + 0x65, 0x20, 0x36, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x4d, 0x5f, + 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x37, 0x22, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x65, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, + 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x4d, 0x20, 0x53, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x37, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x50, 0x4d, 0x20, 0x53, 0x68, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x37, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x20, + 0x50, 0x4d, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x20, 0x70, 0x65, + 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, + 0x5f, 0x50, 0x4d, 0x5f, 0x54, 0x49, 0x4c, 0x45, 0x52, 0x5f, 0x30, 0x22, + 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x50, 0x4d, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x4d, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x3a, + 0x20, 0x50, 0x4d, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x6f, + 0x72, 0x65, 0x20, 0x30, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x20, 0x50, 0x4d, 0x20, 0x4c, 0x32, 0x22, + 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, + 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, + 0x61, 0x72, 0x64, 0x5f, 0x50, 0x4d, 0x5f, 0x4c, 0x32, 0x5f, 0x30, 0x22, + 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x50, 0x4d, 0x20, 0x4c, 0x32, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x50, 0x4d, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, + 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, + 0x4c, 0x32, 0x3a, 0x20, 0x50, 0x4d, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x6f, + 0x72, 0x65, 0x20, 0x30, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x50, 0x4d, + 0x5f, 0x4c, 0x32, 0x5f, 0x31, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, + 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, + 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x4c, 0x32, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x4d, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x50, 0x4d, 0x20, 0x4c, 0x32, 0x3a, 0x20, 0x50, 0x4d, + 0x20, 0x4c, 0x32, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x31, 0x2e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x20, + 0x4d, 0x4d, 0x55, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, + 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4d, 0x4d, + 0x55, 0x5f, 0x41, 0x53, 0x5f, 0x30, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x4d, 0x55, 0x20, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, + 0x4d, 0x55, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x30, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4d, 0x4d, 0x55, 0x5f, 0x41, 0x53, + 0x5f, 0x31, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, + 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x4d, 0x55, 0x20, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x31, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x31, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x5f, 0x4d, 0x4d, 0x55, 0x5f, 0x41, 0x53, 0x5f, 0x32, 0x22, 0x20, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, + 0x4d, 0x55, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4d, 0x4d, 0x55, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x32, 0x20, 0x75, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4d, 0x4d, + 0x55, 0x5f, 0x41, 0x53, 0x5f, 0x33, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x4d, 0x55, 0x20, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x33, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, + 0x4d, 0x55, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x33, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, + 0x64, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, 0x46, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, + 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4d, 0x4d, 0x55, + 0x5f, 0x50, 0x41, 0x47, 0x45, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, + 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, + 0x46, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x41, 0x64, 0x64, 0x2e, 0x20, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x50, 0x61, 0x67, + 0x65, 0x20, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x41, 0x64, 0x64, 0x2e, + 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x30, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x65, 0x77, + 0x6c, 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x73, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, + 0x20, 0x61, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x30, + 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, + 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x4d, 0x4d, 0x55, 0x5f, 0x50, 0x41, + 0x47, 0x45, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x31, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4d, 0x4d, 0x55, 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, 0x46, 0x61, 0x75, + 0x6c, 0x74, 0x20, 0x41, 0x64, 0x64, 0x2e, 0x20, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, 0x46, + 0x61, 0x75, 0x6c, 0x74, 0x20, 0x41, 0x64, 0x64, 0x2e, 0x20, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x20, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x65, 0x77, 0x6c, 0x79, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x73, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x61, 0x20, + 0x4d, 0x4d, 0x55, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x31, 0x2e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x5f, 0x4d, 0x4d, 0x55, 0x5f, 0x50, 0x41, 0x47, 0x45, 0x5f, + 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, 0x4d, 0x55, + 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x20, + 0x41, 0x64, 0x64, 0x2e, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, + 0x4d, 0x55, 0x20, 0x50, 0x61, 0x67, 0x65, 0x20, 0x46, 0x61, 0x75, 0x6c, + 0x74, 0x20, 0x41, 0x64, 0x64, 0x2e, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x6e, 0x65, 0x77, 0x6c, 0x79, 0x20, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x73, + 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x61, 0x20, 0x4d, 0x4d, 0x55, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, + 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x32, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x4d, 0x4d, 0x55, 0x5f, 0x50, 0x41, 0x47, 0x45, 0x5f, 0x46, 0x41, 0x55, + 0x4c, 0x54, 0x5f, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x50, 0x61, + 0x67, 0x65, 0x20, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x41, 0x64, 0x64, + 0x2e, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4d, 0x4d, 0x55, 0x20, + 0x50, 0x61, 0x67, 0x65, 0x20, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x41, + 0x64, 0x64, 0x2e, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x33, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x6e, 0x65, 0x77, 0x6c, 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x73, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x61, 0x20, 0x4d, 0x4d, 0x55, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x20, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x33, 0x2e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, + 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x63, 0x6e, + 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x22, 0x31, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x20, 0x46, 0x69, + 0x6c, 0x6d, 0x73, 0x74, 0x72, 0x69, 0x70, 0x22, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, + 0x72, 0x64, 0x5f, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x74, 0x72, 0x69, 0x70, + 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, + 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x73, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, + 0x3d, 0x22, 0x30, 0x78, 0x33, 0x63, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x31, 0x3a, 0x36, 0x30, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x63, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, + 0x36, 0x30, 0x74, 0x68, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x31, 0x3a, 0x33, 0x30, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x65, 0x76, 0x65, + 0x72, 0x79, 0x20, 0x33, 0x30, 0x74, 0x68, 0x20, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3d, 0x22, 0x30, 0x78, 0x61, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x31, 0x3a, 0x31, 0x30, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x65, + 0x76, 0x65, 0x72, 0x79, 0x20, 0x31, 0x30, 0x74, 0x68, 0x20, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x30, + 0x30, 0x22, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x66, 0x73, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x20, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x46, 0x69, 0x6c, 0x6d, 0x73, 0x74, 0x72, 0x69, 0x70, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x20, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, + 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x47, 0x50, 0x55, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x31, 0x3d, + 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x31, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x36, 0x66, + 0x63, 0x63, 0x22, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, + 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, + 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, + 0x22, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x47, 0x50, 0x55, 0x20, 0x4a, 0x6f, 0x62, + 0x20, 0x53, 0x6c, 0x6f, 0x74, 0x20, 0x30, 0x20, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x4d, 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x76, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x47, 0x50, 0x55, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x54, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2d, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x31, 0x3d, 0x22, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x65, 0x64, 0x61, 0x30, 0x30, 0x30, + 0x22, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x61, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x31, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x47, 0x50, 0x55, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x53, + 0x6c, 0x6f, 0x74, 0x20, 0x31, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x4d, + 0x69, 0x64, 0x67, 0x61, 0x72, 0x64, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x63, + 0x6c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x47, 0x50, + 0x55, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2d, 0x43, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x31, + 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x31, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x65, 0x66, 0x30, + 0x32, 0x32, 0x66, 0x22, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x72, + 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x3d, 0x22, 0x31, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x47, 0x50, 0x55, 0x20, 0x4a, 0x6f, + 0x62, 0x20, 0x53, 0x6c, 0x6f, 0x74, 0x20, 0x32, 0x20, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, + 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x22, 0x20, + 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, + 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, + 0x5f, 0x47, 0x50, 0x55, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x47, 0x50, 0x55, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x47, 0x50, 0x55, + 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x49, 0x52, 0x51, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, + 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x52, 0x51, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x20, 0x47, 0x50, 0x55, 0x20, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x36, 0x30, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x30, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x4a, 0x53, 0x30, 0x20, 0x28, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x29, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4a, + 0x53, 0x31, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, + 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4a, 0x53, 0x31, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x4a, 0x53, 0x31, 0x20, 0x28, + 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x74, 0x69, 0x6c, 0x65, 0x72, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, 0x20, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4a, 0x53, 0x32, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x32, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x20, 0x4a, 0x53, 0x32, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, 0x20, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, + 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x30, 0x20, 0x6a, 0x6f, + 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, 0x20, 0x28, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x30, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, + 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, + 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4a, 0x53, 0x30, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x30, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4a, 0x53, + 0x31, 0x5f, 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x31, 0x20, + 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, 0x20, 0x28, 0x76, + 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x74, 0x69, 0x6c, 0x65, 0x72, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, + 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x4a, 0x53, 0x31, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4a, 0x53, 0x31, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x31, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, + 0x4a, 0x53, 0x32, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, + 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, + 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, + 0x53, 0x32, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4a, 0x53, 0x32, + 0x5f, 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x32, 0x20, 0x6a, + 0x6f, 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, 0x20, 0x28, 0x76, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, + 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, + 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, + 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x47, 0x4f, + 0x4e, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x73, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, + 0x51, 0x55, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x54, 0x52, 0x49, + 0x41, 0x4e, 0x47, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, + 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x69, 0x61, + 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, + 0x6c, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, + 0x54, 0x49, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, + 0x5f, 0x54, 0x49, 0x5f, 0x46, 0x52, 0x4f, 0x4e, 0x54, 0x5f, 0x46, 0x41, + 0x43, 0x49, 0x4e, 0x47, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, + 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, + 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, + 0x49, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x43, 0x49, 0x4e, + 0x47, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x42, 0x61, 0x63, 0x6b, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x66, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x52, 0x49, + 0x4d, 0x5f, 0x56, 0x49, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x52, 0x49, + 0x4d, 0x5f, 0x43, 0x55, 0x4c, 0x4c, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x75, 0x6c, 0x6c, 0x65, + 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x75, 0x6c, 0x6c, + 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x5f, 0x43, + 0x4c, 0x49, 0x50, 0x50, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, + 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x69, 0x70, 0x70, 0x65, 0x64, + 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x70, + 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, + 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, + 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x30, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, + 0x54, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x32, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, + 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, + 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, + 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, + 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x33, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x34, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x34, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, + 0x54, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x35, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x35, + 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, + 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x35, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, + 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, + 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x36, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, + 0x45, 0x56, 0x45, 0x4c, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x37, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, + 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x37, 0x22, 0x2f, + 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, + 0x43, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, + 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x52, 0x49, 0x50, 0x49, + 0x50, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, + 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x69, 0x70, 0x69, 0x70, + 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x74, 0x72, 0x69, 0x70, 0x69, 0x70, 0x65, 0x20, + 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, + 0x46, 0x52, 0x41, 0x47, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, + 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5c, 0x63, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, + 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, + 0x53, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4c, 0x45, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, + 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x69, + 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x73, 0x70, + 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x36, 0x30, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, + 0x52, 0x45, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, + 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x44, 0x55, 0x4d, 0x4d, 0x59, + 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x75, + 0x6d, 0x6d, 0x79, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x75, 0x6d, + 0x6d, 0x79, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x36, 0x30, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, + 0x52, 0x45, 0x41, 0x44, 0x53, 0x5f, 0x4c, 0x5a, 0x53, 0x5f, 0x54, 0x45, + 0x53, 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, + 0x6e, 0x67, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, + 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x20, 0x74, 0x65, 0x73, + 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, 0x45, + 0x41, 0x44, 0x53, 0x5f, 0x4c, 0x5a, 0x53, 0x5f, 0x4b, 0x49, 0x4c, 0x4c, + 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, + 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x43, 0x4f, 0x4d, + 0x50, 0x55, 0x54, 0x45, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, + 0x78, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x54, 0x48, + 0x52, 0x45, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, + 0x46, 0x52, 0x41, 0x47, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, + 0x56, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x74, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, + 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, 0x45, 0x53, 0x5f, + 0x44, 0x52, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x64, + 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, + 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x75, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, + 0x46, 0x52, 0x41, 0x47, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, 0x52, + 0x41, 0x53, 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, 0x72, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, + 0x73, 0x20, 0x72, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, + 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, + 0x5f, 0x45, 0x5a, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x51, 0x75, 0x61, 0x64, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, + 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x61, 0x72, + 0x6c, 0x79, 0x20, 0x5a, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, + 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, + 0x5a, 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x46, 0x52, 0x41, + 0x47, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, 0x45, 0x5a, 0x53, 0x5f, + 0x4b, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, + 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, + 0x20, 0x5a, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, + 0x20, 0x5a, 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x46, + 0x52, 0x41, 0x47, 0x5f, 0x4e, 0x55, 0x4d, 0x5f, 0x54, 0x49, 0x4c, 0x45, + 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x54, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, + 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x5f, 0x45, 0x4c, 0x49, 0x4d, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, + 0x69, 0x6c, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x6b, + 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x54, 0x45, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, + 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, + 0x6c, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, + 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, + 0x5f, 0x41, 0x52, 0x49, 0x54, 0x48, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x41, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, + 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x41, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x41, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x20, 0x28, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x70, 0x65, 0x72, + 0x20, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x22, 0x2f, + 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, + 0x5f, 0x4c, 0x53, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x50, 0x69, + 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x53, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x53, 0x2d, 0x70, + 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, 0x53, 0x5f, 0x49, 0x53, 0x53, 0x55, + 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x53, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x2c, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x45, + 0x58, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x54, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, 0x45, + 0x58, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, + 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74, + 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, + 0x32, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x63, 0x61, + 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x54, + 0x45, 0x58, 0x5f, 0x52, 0x45, 0x43, 0x49, 0x52, 0x43, 0x5f, 0x46, 0x4d, + 0x49, 0x53, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x2d, + 0x70, 0x69, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x63, 0x69, 0x72, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x64, 0x75, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, + 0x48, 0x49, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x68, + 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, + 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, + 0x4d, 0x49, 0x53, 0x53, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, 0x53, 0x43, + 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, + 0x4c, 0x53, 0x43, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x4d, 0x49, + 0x53, 0x53, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, 0x53, 0x43, + 0x5f, 0x41, 0x54, 0x4f, 0x4d, 0x49, 0x43, 0x5f, 0x48, 0x49, 0x54, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x68, 0x69, 0x74, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x68, 0x69, 0x74, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, + 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x41, 0x54, 0x4f, 0x4d, 0x49, + 0x43, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, + 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x74, + 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, + 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, + 0x46, 0x45, 0x54, 0x43, 0x48, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, + 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, + 0x65, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, + 0x4c, 0x53, 0x43, 0x5f, 0x44, 0x49, 0x52, 0x54, 0x59, 0x5f, 0x4c, 0x49, + 0x4e, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x69, 0x72, 0x74, 0x79, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x64, 0x69, 0x72, 0x74, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, + 0x53, 0x43, 0x5f, 0x53, 0x4e, 0x4f, 0x4f, 0x50, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, + 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, + 0x4c, 0x53, 0x43, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x73, 0x6e, 0x6f, 0x6f, + 0x70, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, + 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x70, 0x65, + 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, + 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, + 0x42, 0x45, 0x41, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x62, 0x65, 0x61, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x62, 0x65, 0x61, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, 0x32, + 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x45, + 0x41, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, + 0x65, 0x61, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, + 0x65, 0x61, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x52, 0x45, 0x41, + 0x44, 0x5f, 0x53, 0x4e, 0x4f, 0x4f, 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, + 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x48, 0x49, + 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x20, 0x68, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x30, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, + 0x53, 0x4e, 0x4f, 0x4f, 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, + 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x48, + 0x49, 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x73, 0x20, 0x68, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, + 0x5f, 0x41, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, + 0x62, 0x75, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x28, + 0x41, 0x52, 0x29, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, + 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x28, 0x41, 0x52, 0x29, + 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, + 0x5f, 0x57, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, + 0x75, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x28, 0x57, + 0x29, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x28, 0x57, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x29, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, 0x32, 0x5f, + 0x45, 0x58, 0x54, 0x5f, 0x52, 0x5f, 0x42, 0x55, 0x46, 0x5f, 0x46, 0x55, + 0x4c, 0x4c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, + 0x54, 0x5f, 0x52, 0x44, 0x5f, 0x42, 0x55, 0x46, 0x5f, 0x46, 0x55, 0x4c, + 0x4c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, + 0x58, 0x54, 0x5f, 0x57, 0x5f, 0x42, 0x55, 0x46, 0x5f, 0x46, 0x55, 0x4c, + 0x4c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, 0x5f, + 0x4c, 0x32, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4c, 0x4f, 0x4f, 0x4b, + 0x55, 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x30, 0x78, + 0x5f, 0x4c, 0x32, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x4c, 0x4f, + 0x4f, 0x4b, 0x55, 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x2f, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x0a, 0x20, + 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, + 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x22, 0x20, 0x70, + 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, + 0x47, 0x50, 0x55, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, + 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x47, 0x50, 0x55, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x47, 0x50, 0x55, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x49, 0x52, 0x51, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x52, + 0x51, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x47, 0x50, 0x55, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x30, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x4a, + 0x53, 0x30, 0x20, 0x28, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x29, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4a, 0x53, + 0x31, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, + 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4a, 0x53, 0x31, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x4a, 0x53, 0x31, 0x20, 0x28, 0x76, + 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x74, 0x69, 0x6c, 0x65, 0x72, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x32, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x32, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x4a, 0x53, 0x32, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, 0x20, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x4a, + 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x30, 0x20, 0x6a, 0x6f, 0x62, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, 0x20, 0x28, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x30, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, + 0x4a, 0x53, 0x30, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, + 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, + 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, + 0x53, 0x30, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x31, + 0x5f, 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x31, 0x20, 0x6a, + 0x6f, 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, 0x20, 0x28, 0x76, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x2f, 0x74, 0x69, 0x6c, 0x65, 0x72, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x31, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, + 0x78, 0x5f, 0x4a, 0x53, 0x31, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4a, 0x53, 0x31, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x31, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4a, + 0x53, 0x32, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, + 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, + 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, + 0x32, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x32, 0x5f, + 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x32, 0x20, 0x6a, 0x6f, + 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, 0x20, 0x28, 0x76, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x4a, 0x53, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, + 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, + 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x54, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, + 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, + 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x47, 0x4f, 0x4e, + 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x73, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x51, + 0x55, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x54, 0x52, 0x49, 0x41, + 0x4e, 0x47, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x69, 0x61, 0x6e, + 0x67, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, + 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, + 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, + 0x49, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, + 0x54, 0x49, 0x5f, 0x46, 0x52, 0x4f, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x43, + 0x49, 0x4e, 0x47, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, + 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x69, + 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x6f, + 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x49, + 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x43, 0x49, 0x4e, 0x47, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, + 0x61, 0x63, 0x6b, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, + 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x66, 0x61, + 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x52, 0x49, 0x4d, + 0x5f, 0x56, 0x49, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x52, 0x49, 0x4d, + 0x5f, 0x43, 0x55, 0x4c, 0x4c, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x75, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x75, 0x6c, 0x6c, 0x65, + 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, + 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x5f, 0x43, 0x4c, + 0x49, 0x50, 0x50, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x70, 0x65, + 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x30, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x30, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, + 0x56, 0x45, 0x4c, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, 0x70, 0x72, 0x69, 0x6d, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x31, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, + 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x32, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x33, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x33, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x33, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, + 0x56, 0x45, 0x4c, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x34, 0x20, 0x70, 0x72, 0x69, 0x6d, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x34, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, + 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x35, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x35, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x35, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x36, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x36, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, + 0x56, 0x45, 0x4c, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x37, 0x20, 0x70, 0x72, 0x69, 0x6d, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x37, 0x22, 0x2f, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, + 0x6f, 0x72, 0x65, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, + 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x52, 0x49, 0x50, 0x49, 0x50, + 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, + 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x69, 0x70, 0x69, 0x70, 0x65, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x20, 0x74, 0x72, 0x69, 0x70, 0x69, 0x70, 0x65, 0x20, 0x77, + 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x46, + 0x52, 0x41, 0x47, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x43, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, + 0x78, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x43, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x76, + 0x65, 0x72, 0x74, 0x65, 0x78, 0x5c, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, + 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, + 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4c, 0x45, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, + 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x61, 0x69, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x69, 0x6c, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x73, 0x70, 0x65, + 0x6e, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x43, 0x59, 0x43, 0x4c, + 0x45, 0x53, 0x5f, 0x46, 0x50, 0x4b, 0x51, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x70, 0x69, 0x70, 0x65, + 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x73, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, + 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, + 0x47, 0x5f, 0x44, 0x55, 0x4d, 0x4d, 0x59, 0x5f, 0x54, 0x48, 0x52, 0x45, + 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x75, 0x6d, 0x6d, 0x79, 0x20, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, + 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, + 0x5f, 0x4c, 0x5a, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x61, + 0x74, 0x65, 0x20, 0x5a, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x61, 0x74, 0x65, + 0x20, 0x5a, 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x46, 0x52, + 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, 0x5f, 0x4c, + 0x5a, 0x53, 0x5f, 0x4b, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x20, 0x74, 0x65, 0x73, + 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x36, 0x32, 0x78, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, + 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x43, 0x4f, 0x4d, + 0x50, 0x55, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, + 0x50, 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, 0x45, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x69, 0x6c, 0x65, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x50, 0x52, 0x49, 0x4d, + 0x49, 0x54, 0x49, 0x56, 0x45, 0x53, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x50, + 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x62, 0x65, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x69, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, + 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, 0x52, 0x41, 0x53, 0x54, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x51, 0x75, 0x61, + 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, + 0x61, 0x64, 0x73, 0x20, 0x72, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x7a, + 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x72, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, + 0x47, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, 0x45, 0x5a, 0x53, 0x5f, + 0x54, 0x45, 0x53, 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, + 0x69, 0x6e, 0x67, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, 0x53, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, + 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, 0x53, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x36, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x51, 0x55, 0x41, + 0x44, 0x53, 0x5f, 0x45, 0x5a, 0x53, 0x5f, 0x4b, 0x49, 0x4c, 0x4c, 0x45, + 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, + 0x64, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, + 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, 0x53, 0x20, 0x74, + 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x4e, + 0x55, 0x4d, 0x5f, 0x54, 0x49, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x69, 0x6c, 0x65, + 0x73, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x52, 0x41, 0x4e, + 0x53, 0x5f, 0x45, 0x4c, 0x49, 0x4d, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x69, 0x6c, 0x65, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x54, 0x45, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x70, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x41, 0x52, 0x49, 0x54, + 0x48, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x41, 0x72, 0x69, + 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x20, 0x50, 0x69, 0x70, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x2d, 0x70, + 0x69, 0x70, 0x65, 0x20, 0x28, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x20, 0x70, 0x65, 0x72, 0x20, 0x70, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x5f, 0x57, + 0x4f, 0x52, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4c, 0x53, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, + 0x4c, 0x53, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x50, 0x69, + 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x53, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x53, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x45, 0x58, 0x5f, 0x57, 0x4f, 0x52, + 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x54, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x2d, 0x70, + 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x45, 0x58, 0x5f, 0x49, 0x53, 0x53, + 0x55, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x54, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, + 0x68, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x32, 0x20, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x54, 0x45, 0x58, 0x5f, 0x52, 0x45, + 0x43, 0x49, 0x52, 0x43, 0x5f, 0x46, 0x4d, 0x49, 0x53, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x2c, + 0x20, 0x72, 0x65, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x53, + 0x43, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x53, + 0x43, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x45, + 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, + 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x57, 0x52, 0x49, 0x54, + 0x45, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x57, + 0x52, 0x49, 0x54, 0x45, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x45, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, + 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x41, 0x54, 0x4f, 0x4d, + 0x49, 0x43, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, + 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x74, 0x6f, + 0x6d, 0x69, 0x63, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x6f, + 0x6d, 0x69, 0x63, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x53, + 0x43, 0x5f, 0x41, 0x54, 0x4f, 0x4d, 0x49, 0x43, 0x5f, 0x4d, 0x49, 0x53, + 0x53, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, + 0x63, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x53, + 0x43, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x46, 0x45, 0x54, 0x43, 0x48, + 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x44, + 0x49, 0x52, 0x54, 0x59, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, + 0x69, 0x72, 0x74, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x65, 0x76, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x72, 0x74, + 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x53, 0x4e, + 0x4f, 0x4f, 0x50, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6e, 0x6f, 0x6f, 0x70, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x4c, 0x53, 0x43, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, + 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, + 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x42, 0x45, 0x41, 0x54, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x62, 0x65, 0x61, + 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, + 0x62, 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x62, 0x65, + 0x61, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, + 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x45, 0x41, 0x54, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, 0x65, 0x61, 0x74, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, + 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, 0x65, 0x61, 0x74, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, + 0x5f, 0x4c, 0x32, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x53, 0x4e, 0x4f, + 0x4f, 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, + 0x52, 0x45, 0x41, 0x44, 0x5f, 0x48, 0x49, 0x54, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, + 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x68, 0x69, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x32, + 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x53, 0x4e, 0x4f, 0x4f, 0x50, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, + 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x48, 0x49, 0x54, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, + 0x68, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, + 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x41, 0x52, 0x5f, 0x53, + 0x54, 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x28, 0x41, 0x52, 0x29, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x28, 0x41, 0x52, 0x29, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, + 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x57, 0x5f, 0x53, 0x54, + 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x28, 0x57, 0x29, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x28, + 0x57, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x69, + 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x52, + 0x5f, 0x42, 0x55, 0x46, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, + 0x62, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, + 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x52, 0x44, 0x5f, + 0x42, 0x55, 0x46, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, + 0x75, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x36, + 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x57, 0x5f, + 0x42, 0x55, 0x46, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, + 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, + 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x52, 0x45, + 0x41, 0x44, 0x5f, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, + 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x36, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x57, + 0x52, 0x49, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, + 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x47, 0x50, 0x55, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x47, 0x50, 0x55, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x20, 0x47, 0x50, 0x55, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x32, 0x78, 0x5f, 0x49, 0x52, 0x51, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x52, 0x51, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x47, + 0x50, 0x55, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4a, 0x53, + 0x30, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, + 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4a, 0x53, 0x30, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x4a, 0x53, 0x30, 0x20, 0x28, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x31, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x31, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x4a, 0x53, 0x31, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x2f, 0x74, 0x69, 0x6c, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x29, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, + 0x4a, 0x53, 0x32, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, + 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4a, 0x53, 0x32, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x4a, 0x53, 0x32, 0x20, + 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x29, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, + 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, + 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4a, 0x53, 0x30, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, + 0x73, 0x20, 0x28, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x4a, 0x53, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x54, + 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x30, 0x20, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, + 0x53, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x31, 0x5f, 0x4a, 0x4f, 0x42, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4a, 0x53, 0x31, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4a, + 0x6f, 0x62, 0x73, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, + 0x74, 0x69, 0x6c, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x31, + 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x31, 0x20, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x4a, 0x53, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x32, 0x5f, 0x54, 0x41, + 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x32, 0x20, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, + 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x32, 0x78, 0x5f, 0x4a, 0x53, 0x32, 0x5f, 0x4a, 0x4f, 0x42, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4a, 0x53, 0x32, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x6f, + 0x62, 0x73, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x32, + 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, + 0x6f, 0x22, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, + 0x50, 0x4f, 0x4c, 0x59, 0x47, 0x4f, 0x4e, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, + 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x6c, 0x79, 0x67, + 0x6f, 0x6e, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, + 0x54, 0x49, 0x5f, 0x54, 0x52, 0x49, 0x41, 0x4e, 0x47, 0x4c, 0x45, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x54, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, + 0x4c, 0x49, 0x4e, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x4f, 0x49, + 0x4e, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x46, 0x52, + 0x4f, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x43, 0x49, 0x4e, 0x47, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x6f, + 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, + 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, + 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x37, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x42, 0x41, 0x43, 0x4b, + 0x5f, 0x46, 0x41, 0x43, 0x49, 0x4e, 0x47, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x61, 0x63, 0x6b, 0x20, 0x66, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x62, 0x61, 0x63, 0x6b, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, + 0x54, 0x49, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x5f, 0x56, 0x49, 0x53, 0x49, + 0x42, 0x4c, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, + 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, + 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, + 0x54, 0x49, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x5f, 0x43, 0x55, 0x4c, 0x4c, + 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, + 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x75, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x75, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x54, 0x49, 0x5f, + 0x50, 0x52, 0x49, 0x4d, 0x5f, 0x43, 0x4c, 0x49, 0x50, 0x50, 0x45, 0x44, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, + 0x6c, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x6c, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, + 0x65, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, + 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x32, 0x78, 0x5f, 0x54, 0x52, 0x49, 0x50, 0x49, 0x50, 0x45, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, + 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x54, 0x72, 0x69, 0x70, 0x69, 0x70, 0x65, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x74, 0x72, 0x69, 0x70, 0x69, 0x70, 0x65, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, + 0x47, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, + 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, + 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x76, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x5c, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x77, + 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x46, + 0x52, 0x41, 0x47, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x5f, 0x4e, + 0x4f, 0x5f, 0x54, 0x49, 0x4c, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, + 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, + 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x69, 0x6c, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, + 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, + 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, + 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x46, + 0x52, 0x41, 0x47, 0x5f, 0x44, 0x55, 0x4d, 0x4d, 0x59, 0x5f, 0x54, 0x48, + 0x52, 0x45, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x75, 0x6d, 0x6d, 0x79, + 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, + 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, + 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, + 0x44, 0x53, 0x5f, 0x4c, 0x5a, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x61, + 0x74, 0x65, 0x20, 0x5a, 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, + 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, + 0x5f, 0x4c, 0x5a, 0x53, 0x5f, 0x4b, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x20, 0x74, + 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, + 0x45, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x43, + 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, + 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, + 0x47, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, 0x45, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x69, + 0x6c, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x37, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x50, 0x52, + 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, 0x45, 0x53, 0x5f, 0x44, 0x52, 0x4f, + 0x50, 0x50, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, + 0x70, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x62, + 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, + 0x47, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, 0x52, 0x41, 0x53, 0x54, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x51, + 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, 0x72, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x69, 0x7a, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x72, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x46, + 0x52, 0x41, 0x47, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, 0x45, 0x5a, + 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, + 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, + 0x5a, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, + 0x6e, 0x67, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, 0x53, 0x20, + 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x51, + 0x55, 0x41, 0x44, 0x53, 0x5f, 0x45, 0x5a, 0x53, 0x5f, 0x4b, 0x49, 0x4c, + 0x4c, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, 0x53, + 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, + 0x5f, 0x4e, 0x55, 0x4d, 0x5f, 0x54, 0x49, 0x4c, 0x45, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x69, + 0x6c, 0x65, 0x73, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x37, 0x32, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x5f, 0x45, 0x4c, 0x49, 0x4d, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x69, 0x6c, 0x65, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x54, 0x45, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6c, + 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x73, 0x6b, 0x69, + 0x70, 0x70, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6c, 0x69, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x41, 0x52, + 0x49, 0x54, 0x48, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x41, + 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x20, 0x50, 0x69, + 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x41, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, + 0x53, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, + 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x53, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x53, 0x2d, 0x70, 0x69, 0x70, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x53, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x2c, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x54, 0x45, 0x58, 0x5f, + 0x57, 0x4f, 0x52, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x54, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x54, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x54, 0x45, 0x58, 0x5f, + 0x49, 0x53, 0x53, 0x55, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, 0x72, + 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x32, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x53, + 0x43, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x53, + 0x43, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x45, + 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, + 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x57, 0x52, 0x49, 0x54, + 0x45, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x57, + 0x52, 0x49, 0x54, 0x45, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x45, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, + 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x41, 0x54, 0x4f, 0x4d, + 0x49, 0x43, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, + 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x74, 0x6f, + 0x6d, 0x69, 0x63, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x6f, + 0x6d, 0x69, 0x63, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x53, + 0x43, 0x5f, 0x41, 0x54, 0x4f, 0x4d, 0x49, 0x43, 0x5f, 0x4d, 0x49, 0x53, + 0x53, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, + 0x63, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x53, + 0x43, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x46, 0x45, 0x54, 0x43, 0x48, + 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x44, + 0x49, 0x52, 0x54, 0x59, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, + 0x69, 0x72, 0x74, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x65, 0x76, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x72, 0x74, + 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x53, 0x4e, + 0x4f, 0x4f, 0x50, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6e, 0x6f, 0x6f, 0x70, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x4c, 0x53, 0x43, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, + 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, + 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x42, 0x45, 0x41, 0x54, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x62, 0x65, 0x61, + 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, + 0x62, 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x62, 0x65, + 0x61, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, + 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x45, 0x41, 0x54, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, 0x65, 0x61, 0x74, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, + 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, 0x65, 0x61, 0x74, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, + 0x5f, 0x4c, 0x32, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x53, 0x4e, 0x4f, + 0x4f, 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, + 0x52, 0x45, 0x41, 0x44, 0x5f, 0x48, 0x49, 0x54, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, + 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x68, 0x69, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x32, + 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x53, 0x4e, 0x4f, 0x4f, 0x50, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, + 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x48, 0x49, 0x54, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, + 0x68, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, + 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x41, 0x52, 0x5f, 0x53, + 0x54, 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x28, 0x41, 0x52, 0x29, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x28, 0x41, 0x52, 0x29, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x32, 0x78, + 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x57, 0x5f, 0x53, 0x54, + 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x28, 0x57, 0x29, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x28, + 0x57, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x29, 0x20, 0x69, + 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, + 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4c, 0x32, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x37, 0x32, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x57, 0x52, 0x49, 0x54, + 0x45, 0x5f, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, + 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x36, 0x78, 0x5f, 0x47, 0x50, 0x55, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x47, 0x50, 0x55, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x47, 0x50, 0x55, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, + 0x49, 0x52, 0x51, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, + 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x52, 0x51, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x47, 0x50, 0x55, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x30, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x20, 0x4a, 0x53, 0x30, 0x20, 0x28, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, + 0x78, 0x5f, 0x4a, 0x53, 0x31, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x31, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x4a, 0x53, + 0x31, 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x74, 0x69, + 0x6c, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, + 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4a, 0x53, 0x32, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, + 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, + 0x53, 0x32, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x20, 0x4a, 0x53, 0x32, 0x20, 0x28, 0x76, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x29, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4a, + 0x53, 0x30, 0x5f, 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, + 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, + 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x30, + 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, 0x20, 0x28, + 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, + 0x53, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x36, 0x78, 0x5f, 0x4a, 0x53, 0x30, 0x5f, 0x54, 0x41, 0x53, 0x4b, + 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x30, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x30, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, + 0x5f, 0x4a, 0x53, 0x31, 0x5f, 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, + 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, + 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, + 0x53, 0x31, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, + 0x20, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x74, 0x69, 0x6c, + 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x29, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x4a, 0x53, 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4a, 0x53, 0x31, 0x5f, 0x54, 0x41, + 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, 0x31, 0x20, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, + 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x36, 0x78, 0x5f, 0x4a, 0x53, 0x32, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4a, 0x6f, 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x20, 0x57, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4a, 0x53, 0x32, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x32, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, + 0x4a, 0x53, 0x32, 0x5f, 0x4a, 0x4f, 0x42, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4a, 0x6f, + 0x62, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x57, 0x6f, + 0x72, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4a, 0x53, + 0x32, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x6f, 0x62, 0x73, 0x20, + 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x4a, 0x53, 0x32, 0x22, 0x2f, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x20, 0x70, + 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, + 0x54, 0x49, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x4f, 0x4c, + 0x59, 0x47, 0x4f, 0x4e, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, + 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x6c, 0x79, 0x67, + 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x73, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, + 0x54, 0x49, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, + 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, + 0x54, 0x52, 0x49, 0x41, 0x4e, 0x47, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, + 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x69, + 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x49, 0x4e, + 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x50, 0x72, 0x69, 0x6d, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x46, 0x52, 0x4f, 0x4e, 0x54, + 0x5f, 0x46, 0x41, 0x43, 0x49, 0x4e, 0x47, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6e, + 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, + 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x5f, 0x46, 0x41, + 0x43, 0x49, 0x4e, 0x47, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x42, 0x61, 0x63, 0x6b, 0x20, 0x66, 0x61, 0x63, 0x69, + 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x20, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, + 0x50, 0x52, 0x49, 0x4d, 0x5f, 0x56, 0x49, 0x53, 0x49, 0x42, 0x4c, 0x45, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, + 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, + 0x50, 0x52, 0x49, 0x4d, 0x5f, 0x43, 0x55, 0x4c, 0x4c, 0x45, 0x44, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x75, + 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x75, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x50, 0x52, 0x49, + 0x4d, 0x5f, 0x43, 0x4c, 0x49, 0x50, 0x50, 0x45, 0x44, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x43, 0x75, 0x6c, 0x6c, 0x69, 0x6e, 0x67, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x69, 0x70, + 0x70, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, + 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, + 0x56, 0x45, 0x4c, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x30, 0x20, 0x70, 0x72, 0x69, 0x6d, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x30, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, + 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x31, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x31, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x31, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x32, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x32, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, + 0x56, 0x45, 0x4c, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x33, 0x20, 0x70, 0x72, 0x69, 0x6d, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x33, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, + 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x34, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x34, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x35, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4c, 0x35, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, + 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x20, 0x35, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x49, 0x5f, 0x4c, 0x45, + 0x56, 0x45, 0x4c, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, 0x6c, 0x65, 0x72, 0x20, + 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x36, 0x20, 0x70, 0x72, 0x69, 0x6d, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x36, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, + 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x37, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, + 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x37, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x65, 0x72, + 0x61, 0x72, 0x63, 0x68, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x37, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x53, 0x68, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x22, 0x20, 0x70, 0x65, 0x72, + 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x52, + 0x49, 0x50, 0x49, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x69, + 0x70, 0x69, 0x70, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x72, 0x69, 0x70, 0x69, + 0x70, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, + 0x36, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, + 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, + 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5c, 0x63, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x37, 0x36, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x43, 0x59, + 0x43, 0x4c, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4c, 0x45, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x69, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x20, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x68, 0x79, + 0x73, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, + 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x5f, 0x46, 0x50, 0x4b, 0x51, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x72, 0x65, + 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x70, + 0x69, 0x70, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x2d, + 0x70, 0x69, 0x70, 0x65, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x71, 0x75, 0x61, 0x64, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x36, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, + 0x45, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, + 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x44, 0x55, 0x4d, 0x4d, 0x59, 0x5f, + 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x75, 0x6d, + 0x6d, 0x79, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x75, 0x6d, 0x6d, + 0x79, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x36, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, + 0x45, 0x41, 0x44, 0x53, 0x5f, 0x4c, 0x5a, 0x53, 0x5f, 0x54, 0x45, 0x53, + 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, + 0x67, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, + 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, + 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x41, + 0x44, 0x53, 0x5f, 0x4c, 0x5a, 0x53, 0x5f, 0x4b, 0x49, 0x4c, 0x4c, 0x45, + 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x5a, 0x53, + 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x43, 0x4f, 0x4d, 0x50, + 0x55, 0x54, 0x45, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x53, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, + 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x52, + 0x45, 0x41, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x46, + 0x52, 0x41, 0x47, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, + 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x74, 0x69, 0x6c, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, + 0x50, 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, 0x45, 0x53, 0x5f, 0x44, + 0x52, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, + 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x73, 0x20, 0x64, 0x72, + 0x6f, 0x70, 0x70, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x75, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x46, + 0x52, 0x41, 0x47, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, 0x52, 0x41, + 0x53, 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, 0x72, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, + 0x20, 0x72, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, + 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, + 0x45, 0x5a, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x51, 0x75, 0x61, 0x64, 0x73, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, + 0x73, 0x20, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x61, 0x72, 0x6c, + 0x79, 0x20, 0x5a, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x64, + 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x5a, + 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, + 0x5f, 0x51, 0x55, 0x41, 0x44, 0x53, 0x5f, 0x45, 0x5a, 0x53, 0x5f, 0x4b, + 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x51, 0x75, 0x61, 0x64, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x61, 0x64, 0x73, 0x20, 0x6b, + 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, + 0x5a, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, + 0x5a, 0x53, 0x20, 0x74, 0x65, 0x73, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x46, 0x52, + 0x41, 0x47, 0x5f, 0x4e, 0x55, 0x4d, 0x5f, 0x54, 0x49, 0x4c, 0x45, 0x53, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x54, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x46, 0x52, 0x41, 0x47, 0x5f, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x5f, 0x45, 0x4c, 0x49, 0x4d, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x69, + 0x6c, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x6b, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x54, 0x45, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x69, 0x6c, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x73, + 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6c, + 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, + 0x41, 0x52, 0x49, 0x54, 0x48, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x41, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x20, + 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x41, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x41, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x20, 0x28, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x70, 0x65, 0x72, 0x20, + 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x22, 0x2f, 0x3e, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, + 0x4c, 0x53, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, + 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x53, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x53, 0x2d, 0x70, 0x69, + 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, + 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x53, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, + 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4c, 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4c, 0x53, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x2c, 0x20, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x45, 0x58, + 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x54, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x45, 0x58, + 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, + 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x32, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x63, 0x61, 0x6c, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x54, 0x45, + 0x58, 0x5f, 0x52, 0x45, 0x43, 0x49, 0x52, 0x43, 0x5f, 0x46, 0x4d, 0x49, + 0x53, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x50, 0x69, 0x70, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x2d, 0x70, + 0x69, 0x70, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x63, 0x69, 0x72, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, + 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x48, + 0x49, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, + 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, + 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4d, + 0x49, 0x53, 0x53, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, + 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, + 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, + 0x53, 0x43, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x4d, 0x49, 0x53, + 0x53, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6d, + 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, + 0x41, 0x54, 0x4f, 0x4d, 0x49, 0x43, 0x5f, 0x48, 0x49, 0x54, 0x53, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, + 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x68, 0x69, 0x74, 0x73, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x68, 0x69, 0x74, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, + 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x41, 0x54, 0x4f, 0x4d, 0x49, 0x43, + 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, + 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x74, 0x6f, + 0x6d, 0x69, 0x63, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, + 0x78, 0x5f, 0x4c, 0x53, 0x43, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x46, + 0x45, 0x54, 0x43, 0x48, 0x45, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, + 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x65, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, + 0x53, 0x43, 0x5f, 0x44, 0x49, 0x52, 0x54, 0x59, 0x5f, 0x4c, 0x49, 0x4e, + 0x45, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x69, 0x72, 0x74, 0x79, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x64, 0x69, 0x72, 0x74, 0x79, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x65, + 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x53, + 0x43, 0x5f, 0x53, 0x4e, 0x4f, 0x4f, 0x50, 0x53, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x6f, + 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x6e, + 0x6f, 0x6f, 0x70, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x4c, + 0x53, 0x43, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x68, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4c, 0x6f, 0x61, 0x64, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x3c, + 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, + 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x70, 0x65, 0x72, + 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x3e, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x32, + 0x5f, 0x45, 0x58, 0x54, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x42, + 0x45, 0x41, 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x62, 0x65, 0x61, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x62, 0x65, 0x61, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x32, 0x5f, + 0x45, 0x58, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x45, 0x41, + 0x54, 0x53, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, 0x65, + 0x61, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x20, 0x62, 0x75, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x62, 0x65, + 0x61, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x52, 0x45, 0x41, 0x44, + 0x5f, 0x53, 0x4e, 0x4f, 0x4f, 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, + 0x5f, 0x4c, 0x32, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x48, 0x49, 0x54, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, + 0x20, 0x68, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, + 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x53, + 0x4e, 0x4f, 0x4f, 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x6e, 0x6f, 0x6f, 0x70, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, + 0x5f, 0x4c, 0x32, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x48, 0x49, + 0x54, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x73, 0x20, 0x68, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, + 0x41, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, + 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, + 0x75, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x28, 0x41, + 0x52, 0x29, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x28, 0x41, 0x52, 0x29, 0x20, + 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, 0x5f, + 0x57, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, + 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x28, 0x57, 0x29, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x28, 0x57, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x29, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, + 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, + 0x58, 0x54, 0x5f, 0x52, 0x5f, 0x42, 0x55, 0x46, 0x5f, 0x46, 0x55, 0x4c, + 0x4c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, + 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, 0x54, + 0x5f, 0x52, 0x44, 0x5f, 0x42, 0x55, 0x46, 0x5f, 0x46, 0x55, 0x4c, 0x4c, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, + 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, + 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, 0x32, 0x5f, 0x45, 0x58, + 0x54, 0x5f, 0x57, 0x5f, 0x42, 0x55, 0x46, 0x5f, 0x46, 0x55, 0x4c, 0x4c, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, 0x6c, + 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x62, 0x75, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, + 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, 0x4c, + 0x32, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, + 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x61, + 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x54, 0x37, 0x36, 0x78, 0x5f, + 0x4c, 0x32, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x4f, + 0x4b, 0x55, 0x50, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x61, 0x6c, 0x69, 0x20, 0x4c, 0x32, 0x20, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x32, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x22, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, + 0x63, 0x6e, 0x74, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x77, 0x65, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, + 0x61, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, 0x63, 0x6e, + 0x74, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, + 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x2d, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, + 0x6e, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x56, 0x45, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, + 0x5f, 0x63, 0x6e, 0x74, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x20, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x73, 0x75, + 0x6d, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, + 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6d, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, + 0x56, 0x45, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, + 0x63, 0x6e, 0x74, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x20, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x65, 0x75, 0x65, + 0x64, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2d, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2d, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, + 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, + 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x56, 0x45, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, + 0x63, 0x6e, 0x74, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x20, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x73, 0x75, + 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2d, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2d, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4d, 0x56, 0x45, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, + 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f, + 0x75, 0x67, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, + 0x63, 0x6e, 0x74, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, + 0x30, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, + 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x20, 0x41, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x2e, 0x20, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x2d, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, + 0x63, 0x6e, 0x74, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x20, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x46, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x73, 0x20, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x71, 0x75, + 0x65, 0x75, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x56, 0x35, 0x30, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x39, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, + 0x30, 0x30, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x20, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x73, + 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, 0x63, 0x6e, 0x74, + 0x31, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x20, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, + 0x46, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x73, 0x20, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x31, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, + 0x56, 0x35, 0x30, 0x30, 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x46, 0x6c, 0x75, + 0x73, 0x68, 0x65, 0x73, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6c, 0x75, + 0x73, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, + 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, + 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x20, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, + 0x20, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2d, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4d, 0x56, 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, + 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, + 0x56, 0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, + 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x73, 0x20, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, + 0x79, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x56, 0x45, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, + 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x51, 0x75, 0x65, + 0x75, 0x65, 0x20, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, + 0x6c, 0x75, 0x73, 0x68, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4d, 0x56, 0x45, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x2d, 0x71, 0x75, 0x65, 0x75, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, + 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, 0x63, 0x6e, 0x74, + 0x31, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, + 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x51, 0x75, 0x65, 0x75, 0x65, 0x20, 0x46, 0x6c, 0x75, + 0x73, 0x68, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x65, 0x73, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x56, 0x45, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2d, 0x71, 0x75, 0x65, 0x75, 0x65, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, + 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, + 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 0x65, 0x6e, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, + 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, + 0x20, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x69, 0x74, 0x73, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x22, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, + 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, 0x63, 0x6e, + 0x74, 0x31, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x42, 0x61, 0x6e, + 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x46, 0x42, 0x43, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x41, 0x46, 0x42, 0x43, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, + 0x30, 0x5f, 0x63, 0x6e, 0x74, 0x31, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, + 0x20, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x29, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x41, 0x58, 0x49, 0x20, 0x62, 0x75, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, + 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, + 0x5f, 0x63, 0x6e, 0x74, 0x32, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, + 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x20, 0x28, 0x77, 0x72, 0x69, 0x74, 0x65, 0x29, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x62, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x6f, 0x76, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x58, 0x49, 0x20, 0x62, + 0x75, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, + 0x35, 0x30, 0x30, 0x5f, 0x65, 0x76, 0x6e, 0x30, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, + 0x30, 0x20, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, + 0x65, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, + 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, 0x65, 0x76, 0x6e, 0x31, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, + 0x56, 0x35, 0x30, 0x30, 0x20, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, + 0x65, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, + 0x30, 0x5f, 0x65, 0x76, 0x6e, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4d, 0x56, 0x45, 0x20, 0x68, 0x61, 0x73, 0x20, 0x66, + 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, + 0x35, 0x30, 0x30, 0x5f, 0x65, 0x76, 0x6e, 0x33, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, + 0x30, 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x56, 0x45, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x41, 0x52, + 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x5f, + 0x65, 0x76, 0x6e, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, + 0x6e, 0x20, 0x77, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x75, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4d, 0x56, 0x45, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x3d, 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x56, 0x35, 0x30, 0x30, 0x5f, 0x61, 0x63, 0x74, 0x30, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, + 0x30, 0x30, 0x20, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x31, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x66, 0x66, 0x22, 0x20, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x62, 0x61, 0x72, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, + 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x72, 0x65, + 0x73, 0x3d, 0x22, 0x38, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, + 0x56, 0x35, 0x30, 0x30, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, + 0x22, 0x41, 0x52, 0x4d, 0x5f, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, + 0x30, 0x30, 0x5f, 0x61, 0x63, 0x74, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x56, 0x45, 0x2d, 0x56, 0x35, 0x30, 0x30, + 0x20, 0x50, 0x69, 0x70, 0x65, 0x64, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x31, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x30, 0x30, + 0x30, 0x66, 0x66, 0x30, 0x30, 0x22, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, + 0x61, 0x72, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x3d, 0x22, + 0x79, 0x65, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, + 0x38, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x61, 0x6c, 0x69, 0x2d, 0x56, 0x35, 0x30, + 0x30, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x50, 0x65, 0x72, 0x66, 0x5f, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, + 0x72, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x3d, 0x22, 0x36, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x50, 0x65, 0x72, 0x66, 0x20, 0x48, 0x61, 0x72, 0x64, 0x77, + 0x61, 0x72, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x50, 0x65, 0x72, 0x66, 0x5f, 0x48, + 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x22, + 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x50, 0x65, 0x72, 0x66, 0x5f, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, + 0x65, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, + 0x22, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, + 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, + 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, + 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x4d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x34, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, + 0x68, 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6c, + 0x6f, 0x77, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, + 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, + 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x35, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, + 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x75, 0x73, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x42, 0x75, 0x73, 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x37, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x46, 0x72, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x20, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, + 0x20, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x43, 0x79, 0x63, 0x6c, + 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x4d, 0x50, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x3d, 0x22, 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x4d, + 0x50, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, + 0x65, 0x74, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x4d, 0x50, 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x70, 0x65, 0x72, 0x5f, + 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x4d, 0x50, 0x5f, 0x63, 0x63, 0x6e, 0x74, 0x22, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x66, 0x66, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x6c, 0x6f, 0x63, + 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x3d, 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, 0x75, 0x6e, 0x69, + 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x3d, 0x22, 0x79, + 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, + 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, + 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x32, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, + 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, + 0x54, 0x4c, 0x42, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, 0x66, + 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x34, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x35, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x54, + 0x4c, 0x42, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x77, 0x72, 0x69, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, + 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x54, + 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, + 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x45, + 0x58, 0x54, 0x49, 0x44, 0x52, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, + 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x57, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, + 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x50, + 0x43, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x62, 0x79, + 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x2c, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x65, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, + 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x28, + 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x79, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, + 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, 0x69, 0x73, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6d, 0x69, 0x73, 0x70, 0x72, 0x65, + 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, + 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x50, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x72, + 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, + 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x6c, 0x6f, + 0x77, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x34, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x45, 0x58, + 0x50, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, + 0x74, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x34, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4d, + 0x49, 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x65, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x66, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x43, + 0x41, 0x43, 0x48, 0x45, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x52, 0x45, + 0x51, 0x5f, 0x4c, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x4c, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x35, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x43, 0x41, 0x43, 0x48, 0x45, + 0x5f, 0x4e, 0x4f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4c, 0x32, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6e, 0x6f, + 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x4c, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x48, 0x49, 0x51, 0x55, 0x50, 0x5f, 0x4e, + 0x4f, 0x50, 0x45, 0x44, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x48, 0x49, 0x51, 0x55, + 0x50, 0x73, 0x20, 0x4e, 0x4f, 0x50, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x32, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, + 0x41, 0x54, 0x41, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x35, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x52, 0x51, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x49, + 0x52, 0x51, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x49, 0x51, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x46, 0x49, 0x51, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x35, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x4c, 0x4c, 0x5f, 0x45, + 0x58, 0x43, 0x50, 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x41, 0x6c, 0x6c, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, + 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x37, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x53, 0x56, 0x43, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, + 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x53, 0x56, 0x43, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, + 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x53, 0x4d, 0x43, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x53, 0x4d, + 0x43, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x35, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x52, 0x45, 0x46, 0x45, 0x54, 0x43, 0x48, + 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x50, + 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x41, 0x62, 0x6f, 0x72, + 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x35, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5f, 0x43, 0x48, + 0x45, 0x43, 0x4b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, + 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x62, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4e, 0x55, + 0x4c, 0x4c, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x4e, 0x75, 0x6c, 0x6c, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, + 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x45, 0x58, 0x50, 0x4c, 0x5f, 0x49, 0x43, 0x49, 0x41, 0x4c, + 0x4c, 0x55, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x54, 0x41, 0x43, 0x20, 0x49, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x45, 0x78, + 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x20, 0x49, 0x43, 0x49, 0x41, 0x4c, + 0x4c, 0x55, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x4d, 0x50, 0x4c, 0x5f, 0x49, 0x43, + 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x54, 0x41, 0x43, + 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x20, 0x49, 0x43, + 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4e, 0x4f, 0x4e, 0x49, + 0x43, 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x5f, 0x42, 0x54, 0x41, 0x43, 0x5f, + 0x49, 0x4e, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x54, 0x41, 0x43, 0x20, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x4e, + 0x6f, 0x6e, 0x2d, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x20, 0x42, + 0x54, 0x41, 0x43, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x43, 0x49, 0x4d, 0x56, 0x41, 0x55, + 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x5f, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x4c, + 0x55, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x42, 0x54, 0x41, 0x43, 0x20, 0x49, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x49, 0x43, 0x49, + 0x4d, 0x56, 0x41, 0x55, 0x2d, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, + 0x20, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, + 0x50, 0x49, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x43, 0x59, + 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x73, 0x73, 0x75, 0x65, + 0x20, 0x53, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, + 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x36, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, 0x49, 0x50, 0x45, 0x5f, 0x4f, 0x4e, + 0x4c, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x73, 0x73, 0x75, 0x65, 0x20, 0x58, 0x2d, 0x70, 0x69, 0x70, 0x65, + 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x32, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x55, 0x41, + 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x73, 0x73, 0x75, 0x65, 0x20, 0x64, 0x75, 0x61, 0x6c, 0x20, 0x69, 0x73, + 0x73, 0x75, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x33, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x41, 0x4e, + 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61, 0x6e, 0x79, 0x20, + 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x36, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x49, 0x46, 0x4f, 0x5f, 0x46, + 0x55, 0x4c, 0x4c, 0x42, 0x4c, 0x4b, 0x5f, 0x43, 0x4d, 0x54, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x54, 0x72, 0x61, + 0x63, 0x65, 0x20, 0x46, 0x49, 0x46, 0x4f, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x20, 0x42, 0x6c, 0x6b, 0x20, 0x43, 0x4d, 0x54, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x35, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, + 0x41, 0x49, 0x4c, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x53, + 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x73, 0x20, 0x28, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x65, 0x73, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x36, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x41, 0x53, 0x53, 0x5f, + 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x73, 0x20, 0x28, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x29, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x55, 0x5f, + 0x43, 0x4c, 0x4b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x69, 0x74, 0x20, 0x43, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x47, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x56, 0x55, 0x20, 0x43, 0x6c, 0x6b, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x36, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x55, 0x5f, 0x49, 0x44, 0x4c, 0x45, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x55, 0x6e, 0x69, 0x74, 0x20, 0x43, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x47, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x56, 0x55, 0x20, 0x49, + 0x64, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x36, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x5f, + 0x4c, 0x32, 0x5f, 0x43, 0x4c, 0x4b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x69, + 0x74, 0x20, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x47, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x4c, 0x32, 0x20, + 0x43, 0x6c, 0x6b, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x36, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, 0x5f, 0x49, 0x44, + 0x4c, 0x45, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x69, 0x74, 0x20, 0x43, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x47, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4c, + 0x32, 0x20, 0x49, 0x64, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x62, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x54, 0x4c, + 0x42, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x5f, 0x53, + 0x43, 0x54, 0x4c, 0x52, 0x5f, 0x44, 0x41, 0x43, 0x52, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x44, 0x54, 0x4c, 0x42, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, + 0x74, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x53, 0x43, 0x54, 0x4c, 0x52, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x44, 0x41, + 0x43, 0x52, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x36, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x54, 0x4c, 0x42, 0x5f, 0x45, 0x58, + 0x50, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x54, 0x4c, + 0x42, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x20, 0x69, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x64, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x44, 0x54, 0x4c, 0x42, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x44, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x36, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x44, 0x54, 0x4c, 0x42, 0x5f, 0x41, 0x43, 0x43, 0x45, + 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x54, 0x4c, 0x42, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x66, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x54, 0x4c, + 0x42, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x54, 0x4c, + 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x30, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, + 0x54, 0x4c, 0x42, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x5f, 0x49, 0x4e, 0x56, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x54, 0x4c, 0x42, 0x20, 0x69, 0x6d, 0x70, 0x6c, + 0x69, 0x63, 0x69, 0x74, 0x20, 0x49, 0x54, 0x4c, 0x42, 0x20, 0x69, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x31, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x49, 0x54, 0x4c, 0x42, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x5f, 0x49, 0x4e, + 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x54, 0x4c, 0x42, 0x20, 0x65, 0x78, 0x70, + 0x6c, 0x69, 0x63, 0x69, 0x74, 0x20, 0x49, 0x54, 0x4c, 0x42, 0x20, 0x69, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x32, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x44, 0x5f, 0x4d, 0x49, 0x53, 0x53, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x20, 0x64, 0x2d, 0x73, 0x69, + 0x64, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x33, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x44, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, + 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x20, 0x64, 0x2d, 0x73, + 0x69, 0x64, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x37, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x49, 0x5f, 0x4d, 0x49, + 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x20, 0x69, 0x2d, + 0x73, 0x69, 0x64, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x49, 0x5f, 0x41, 0x43, 0x43, + 0x45, 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x20, 0x69, + 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x37, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x49, 0x4e, + 0x56, 0x5f, 0x41, 0x53, 0x49, 0x44, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, + 0x42, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x20, 0x62, 0x79, 0x20, 0x41, 0x53, 0x49, 0x44, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x37, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, + 0x54, 0x4c, 0x42, 0x5f, 0x49, 0x4e, 0x56, 0x5f, 0x4d, 0x56, 0x41, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x20, 0x62, 0x79, 0x20, 0x4d, 0x56, 0x41, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x37, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x49, 0x4e, 0x56, 0x5f, + 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x20, 0x69, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x37, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x32, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x5f, + 0x52, 0x44, 0x51, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x53, 0x32, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x52, 0x44, + 0x51, 0x20, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x61, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x53, 0x32, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x32, + 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x32, 0x5f, 0x48, + 0x4f, 0x4c, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x5f, 0x4f, 0x50, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x32, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x20, 0x6f, 0x70, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x63, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x32, 0x5f, + 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x32, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x73, 0x74, 0x72, + 0x6f, 0x6e, 0x67, 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, + 0x64, 0x20, 0x6f, 0x70, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x37, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x32, 0x5f, 0x48, 0x4f, + 0x4c, 0x44, 0x5f, 0x42, 0x41, 0x52, 0x52, 0x49, 0x45, 0x52, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x32, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x62, 0x61, 0x72, + 0x72, 0x69, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x37, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x49, 0x55, 0x5f, 0x44, + 0x55, 0x41, 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x49, 0x55, + 0x20, 0x64, 0x75, 0x61, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x56, 0x49, 0x55, 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, + 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x49, 0x55, 0x20, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x30, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x56, 0x58, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x5f, 0x57, 0x41, 0x52, + 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, + 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x20, 0x56, 0x58, 0x20, 0x70, 0x69, 0x70, 0x65, 0x20, 0x57, 0x41, 0x52, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x31, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x58, + 0x5f, 0x50, 0x49, 0x50, 0x45, 0x5f, 0x57, 0x41, 0x57, 0x5f, 0x53, 0x54, + 0x41, 0x4c, 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x58, + 0x20, 0x70, 0x69, 0x70, 0x65, 0x20, 0x57, 0x41, 0x57, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x38, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x58, 0x5f, 0x50, 0x49, + 0x50, 0x45, 0x5f, 0x52, 0x41, 0x57, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, + 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x58, 0x20, 0x70, 0x69, + 0x70, 0x65, 0x20, 0x52, 0x41, 0x57, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x38, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x58, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x5f, + 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x55, 0x53, 0x45, 0x5f, 0x53, 0x54, 0x41, + 0x4c, 0x4c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x20, 0x56, 0x58, 0x20, 0x70, 0x69, 0x70, 0x65, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x38, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x56, 0x53, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x5f, 0x57, + 0x41, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x5f, 0x43, 0x59, 0x43, + 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x20, 0x56, 0x53, 0x20, 0x70, 0x69, 0x70, 0x65, 0x20, 0x57, + 0x41, 0x52, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x38, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x53, 0x5f, 0x50, 0x49, 0x50, + 0x45, 0x5f, 0x57, 0x41, 0x57, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x5f, + 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x53, 0x20, 0x70, 0x69, 0x70, + 0x65, 0x20, 0x57, 0x41, 0x57, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x36, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x53, 0x5f, + 0x50, 0x49, 0x50, 0x45, 0x5f, 0x52, 0x41, 0x57, 0x5f, 0x53, 0x54, 0x41, + 0x4c, 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x53, 0x20, + 0x70, 0x69, 0x70, 0x65, 0x20, 0x52, 0x41, 0x57, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x37, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x49, + 0x4e, 0x56, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, + 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x38, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x58, 0x43, 0x45, 0x50, + 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x44, 0x49, 0x56, 0x5f, 0x42, 0x59, + 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, + 0x62, 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x65, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x39, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x4f, 0x4e, + 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x5f, + 0x56, 0x58, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, + 0x56, 0x58, 0x20, 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x61, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x43, 0x4f, + 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, + 0x5f, 0x56, 0x53, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x20, 0x56, 0x53, 0x20, 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x62, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, + 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4f, 0x56, + 0x45, 0x52, 0x46, 0x4c, 0x4f, 0x57, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, + 0x6f, 0x77, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x38, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, + 0x4e, 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x52, 0x46, 0x4c, 0x4f, 0x57, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, + 0x75, 0x6e, 0x64, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x64, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, + 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x44, 0x45, + 0x4e, 0x4f, 0x52, 0x4d, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x20, 0x65, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x65, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x4d, 0x50, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x4e, 0x55, 0x4d, 0x5f, 0x42, 0x41, 0x52, 0x52, 0x49, 0x45, + 0x52, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x38, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x4d, 0x50, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x52, 0x52, 0x49, 0x45, + 0x52, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x42, + 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x6e, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3d, + 0x22, 0x34, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x22, + 0x20, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x79, 0x65, + 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x63, 0x6e, + 0x74, 0x22, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x66, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x43, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3d, 0x22, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x20, + 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x48, 0x7a, 0x22, 0x20, 0x61, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x61, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x54, 0x68, 0x65, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x30, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, + 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, + 0x20, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x31, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, + 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x75, + 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x30, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x49, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, + 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, + 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, + 0x6f, 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x33, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, + 0x66, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, + 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, + 0x6c, 0x6c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, + 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, + 0x61, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x6c, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, + 0x66, 0x20, 0x54, 0x4c, 0x42, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x36, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x72, 0x65, 0x61, 0x64, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x72, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x77, 0x72, 0x69, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x39, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x54, 0x61, 0x6b, 0x65, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x45, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x61, 0x6b, + 0x65, 0x6e, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x30, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x63, 0x68, + 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x62, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x4f, + 0x4e, 0x54, 0x45, 0x58, 0x54, 0x49, 0x44, 0x52, 0x20, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x63, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x57, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x50, 0x43, 0x2c, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, + 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x64, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x74, 0x65, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6d, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x74, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x30, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x64, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x64, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x79, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x30, 0x66, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x6e, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x31, 0x30, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4d, + 0x69, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6d, 0x69, 0x73, + 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, + 0x65, 0x64, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x31, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x50, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6f, 0x72, 0x20, + 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, + 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, + 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, + 0x6e, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x34, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x43, 0x41, 0x43, 0x48, 0x45, + 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6c, + 0x69, 0x63, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x34, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x43, 0x41, 0x43, 0x48, + 0x45, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, + 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x41, 0x43, 0x43, + 0x45, 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x34, 0x66, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x49, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x43, 0x41, 0x43, 0x48, + 0x45, 0x52, 0x45, 0x51, 0x5f, 0x4c, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x4c, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x30, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x43, 0x41, + 0x43, 0x48, 0x45, 0x5f, 0x4e, 0x4f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, + 0x4c, 0x32, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x4c, 0x32, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x48, 0x49, 0x51, 0x55, + 0x50, 0x5f, 0x4e, 0x4f, 0x50, 0x45, 0x44, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x48, + 0x49, 0x51, 0x55, 0x50, 0x73, 0x20, 0x4e, 0x4f, 0x50, 0x65, 0x64, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, + 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x44, 0x61, 0x74, 0x61, 0x20, 0x41, 0x62, + 0x6f, 0x72, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x35, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x52, 0x51, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x49, 0x52, 0x51, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x49, 0x51, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x46, 0x49, 0x51, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x35, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x4c, + 0x4c, 0x5f, 0x45, 0x58, 0x43, 0x50, 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x41, 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, + 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x35, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x56, 0x43, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x53, + 0x56, 0x43, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x4d, 0x43, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x53, 0x4d, 0x43, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x35, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x52, 0x45, 0x46, 0x45, + 0x54, 0x43, 0x48, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x50, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x41, + 0x62, 0x6f, 0x72, 0x74, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x35, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x4e, 0x44, 0x45, 0x58, + 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x62, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x4e, 0x75, 0x6c, 0x6c, 0x20, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x35, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x58, 0x50, 0x4c, 0x5f, 0x49, 0x43, + 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x54, 0x41, 0x43, + 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x45, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x20, 0x49, 0x43, + 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x4d, 0x50, 0x4c, + 0x5f, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, + 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, + 0x54, 0x41, 0x43, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, + 0x20, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x65, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4e, + 0x4f, 0x4e, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x5f, 0x42, 0x54, + 0x41, 0x43, 0x5f, 0x49, 0x4e, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x54, 0x41, + 0x43, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x4e, 0x6f, 0x6e, 0x2d, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x4c, + 0x55, 0x20, 0x42, 0x54, 0x41, 0x43, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x35, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x43, 0x49, 0x4d, + 0x56, 0x41, 0x55, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x5f, 0x49, 0x43, 0x49, + 0x41, 0x4c, 0x4c, 0x55, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x2d, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x54, 0x41, 0x43, 0x20, + 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x49, 0x43, 0x49, 0x4d, 0x56, 0x41, 0x55, 0x2d, 0x69, 0x6d, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x20, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x4c, 0x55, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, + 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x53, 0x50, 0x49, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, + 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x73, + 0x73, 0x75, 0x65, 0x20, 0x53, 0x2d, 0x70, 0x69, 0x70, 0x65, 0x20, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x36, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x58, 0x50, 0x49, 0x50, 0x45, + 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x49, 0x73, 0x73, 0x75, 0x65, 0x20, 0x58, 0x2d, 0x70, + 0x69, 0x70, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x32, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x49, 0x73, 0x73, 0x75, 0x65, 0x20, 0x64, 0x75, 0x61, 0x6c, + 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x36, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, + 0x5f, 0x41, 0x4e, 0x59, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61, + 0x6e, 0x79, 0x20, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x34, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x46, 0x49, 0x46, + 0x4f, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x42, 0x4c, 0x4b, 0x5f, 0x43, 0x4d, + 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x20, + 0x54, 0x72, 0x61, 0x63, 0x65, 0x20, 0x46, 0x49, 0x46, 0x4f, 0x20, 0x66, + 0x75, 0x6c, 0x6c, 0x20, 0x42, 0x6c, 0x6b, 0x20, 0x43, 0x4d, 0x54, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, + 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x46, 0x41, 0x49, 0x4c, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x5f, + 0x49, 0x4e, 0x53, 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x73, 0x20, 0x28, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x36, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x50, 0x41, + 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x54, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x73, 0x20, 0x28, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x36, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x5f, + 0x56, 0x55, 0x5f, 0x43, 0x4c, 0x4b, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x69, + 0x74, 0x20, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x47, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x56, 0x55, 0x20, + 0x43, 0x6c, 0x6b, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x36, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x55, 0x5f, 0x49, 0x44, + 0x4c, 0x45, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x69, 0x74, 0x20, 0x43, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x47, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x56, + 0x55, 0x20, 0x49, 0x64, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x39, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x41, 0x4c, 0x4c, + 0x4f, 0x57, 0x5f, 0x4c, 0x32, 0x5f, 0x43, 0x4c, 0x4b, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x55, 0x6e, 0x69, 0x74, 0x20, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x47, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x20, + 0x4c, 0x32, 0x20, 0x43, 0x6c, 0x6b, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x61, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x4c, 0x32, + 0x5f, 0x49, 0x44, 0x4c, 0x45, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x6e, 0x69, 0x74, + 0x20, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x47, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x4c, 0x32, 0x20, 0x49, 0x64, 0x6c, 0x65, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x62, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x44, 0x54, 0x4c, 0x42, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x5f, 0x49, 0x4e, + 0x56, 0x5f, 0x53, 0x43, 0x54, 0x4c, 0x52, 0x5f, 0x44, 0x41, 0x43, 0x52, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x44, 0x54, 0x4c, 0x42, 0x20, 0x69, 0x6d, 0x70, 0x6c, + 0x69, 0x63, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x53, 0x43, 0x54, 0x4c, 0x52, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x44, 0x41, 0x43, 0x52, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x54, 0x4c, 0x42, + 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x44, 0x54, 0x4c, 0x42, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, + 0x74, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x36, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x54, 0x4c, 0x42, 0x5f, 0x4d, 0x49, 0x53, + 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, + 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x36, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, 0x54, 0x4c, 0x42, 0x5f, 0x41, + 0x43, 0x43, 0x45, 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x44, 0x54, 0x4c, 0x42, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x36, 0x66, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x49, 0x54, 0x4c, 0x42, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x49, 0x54, 0x4c, 0x42, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x49, 0x54, 0x4c, 0x42, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x5f, + 0x49, 0x4e, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x54, 0x4c, 0x42, 0x20, 0x69, + 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x20, 0x49, 0x54, 0x4c, 0x42, + 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x37, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x49, 0x54, 0x4c, 0x42, 0x5f, 0x45, 0x58, 0x50, 0x4c, + 0x5f, 0x49, 0x4e, 0x56, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x49, 0x54, 0x4c, 0x42, 0x20, + 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x20, 0x49, 0x54, 0x4c, + 0x42, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x37, 0x32, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x44, 0x5f, 0x4d, + 0x49, 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x20, 0x64, + 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x37, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x44, 0x5f, 0x41, 0x43, + 0x43, 0x45, 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x20, + 0x64, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x37, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x49, + 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, + 0x20, 0x69, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, + 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x37, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x49, 0x5f, + 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, + 0x42, 0x20, 0x69, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, + 0x5f, 0x49, 0x4e, 0x56, 0x5f, 0x41, 0x53, 0x49, 0x44, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x55, 0x54, 0x4c, 0x42, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x20, 0x62, 0x79, 0x20, 0x41, 0x53, 0x49, 0x44, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, + 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x49, 0x4e, 0x56, 0x5f, 0x4d, + 0x56, 0x41, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x20, 0x69, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x20, 0x62, 0x79, 0x20, + 0x4d, 0x56, 0x41, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x37, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x55, 0x54, 0x4c, 0x42, 0x5f, 0x49, + 0x4e, 0x56, 0x5f, 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x55, 0x54, 0x4c, + 0x42, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x20, 0x61, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x37, 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x32, 0x5f, 0x48, 0x4f, + 0x4c, 0x44, 0x5f, 0x52, 0x44, 0x51, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, + 0x49, 0x4c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x32, 0x20, 0x68, 0x6f, 0x6c, 0x64, + 0x20, 0x52, 0x44, 0x51, 0x20, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x37, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x53, 0x32, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x32, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x62, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, + 0x32, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x5f, 0x4f, + 0x50, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x32, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x20, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x70, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x63, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x53, 0x32, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x32, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x20, + 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x70, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x64, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x53, 0x32, + 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x42, 0x41, 0x52, 0x52, 0x49, 0x45, + 0x52, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x32, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x20, + 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x37, 0x65, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x49, + 0x55, 0x5f, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, + 0x56, 0x49, 0x55, 0x20, 0x64, 0x75, 0x61, 0x6c, 0x20, 0x63, 0x79, 0x63, + 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x37, 0x66, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x49, 0x55, 0x5f, 0x53, 0x49, 0x4e, + 0x47, 0x4c, 0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x49, 0x55, + 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x38, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x58, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x5f, + 0x57, 0x41, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x5f, 0x43, 0x59, + 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x58, 0x20, 0x70, 0x69, 0x70, 0x65, 0x20, + 0x57, 0x41, 0x52, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x31, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x56, 0x58, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x5f, 0x57, 0x41, 0x57, + 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, + 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x20, 0x56, 0x58, 0x20, 0x70, 0x69, 0x70, 0x65, 0x20, 0x57, 0x41, 0x57, + 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x32, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x58, + 0x5f, 0x50, 0x49, 0x50, 0x45, 0x5f, 0x52, 0x41, 0x57, 0x5f, 0x53, 0x54, + 0x41, 0x4c, 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x58, + 0x20, 0x70, 0x69, 0x70, 0x65, 0x20, 0x52, 0x41, 0x57, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x38, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x58, 0x5f, 0x50, 0x49, + 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x55, 0x53, 0x45, 0x5f, + 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x58, 0x20, 0x70, 0x69, 0x70, 0x65, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x38, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x53, 0x5f, 0x50, 0x49, 0x50, + 0x45, 0x5f, 0x57, 0x41, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x5f, + 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x53, 0x20, 0x70, 0x69, 0x70, + 0x65, 0x20, 0x57, 0x41, 0x52, 0x20, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x35, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x56, 0x53, 0x5f, + 0x50, 0x49, 0x50, 0x45, 0x5f, 0x57, 0x41, 0x57, 0x5f, 0x53, 0x54, 0x41, + 0x4c, 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x53, 0x20, + 0x70, 0x69, 0x70, 0x65, 0x20, 0x57, 0x41, 0x57, 0x20, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x36, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x56, 0x53, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x5f, 0x52, 0x41, 0x57, 0x5f, + 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x53, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, + 0x56, 0x53, 0x20, 0x70, 0x69, 0x70, 0x65, 0x20, 0x52, 0x41, 0x57, 0x20, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x38, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, + 0x53, 0x5f, 0x49, 0x4e, 0x56, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x38, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x58, + 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x44, 0x49, 0x56, + 0x5f, 0x42, 0x59, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x76, 0x69, + 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x65, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x39, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x5f, 0x56, 0x58, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x20, 0x56, 0x58, 0x20, 0x70, 0x69, 0x70, 0x65, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x61, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x43, 0x4f, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x46, + 0x41, 0x49, 0x4c, 0x5f, 0x56, 0x53, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x20, 0x56, 0x53, 0x20, 0x70, 0x69, 0x70, 0x65, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x62, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, + 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x46, 0x4c, 0x4f, 0x57, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x76, 0x65, + 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x38, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x58, 0x43, 0x45, 0x50, + 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x52, 0x46, + 0x4c, 0x4f, 0x57, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, + 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, + 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x45, 0x58, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, + 0x5f, 0x44, 0x45, 0x4e, 0x4f, 0x52, 0x4d, 0x22, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x72, + 0x6d, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x38, 0x65, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, 0x41, 0x42, 0x5f, 0x48, + 0x49, 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, + 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x41, + 0x2f, 0x42, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x38, 0x66, 0x22, 0x20, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, + 0x4e, 0x4b, 0x5f, 0x41, 0x42, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, 0x72, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x41, 0x2f, 0x42, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x30, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, + 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x42, 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x44, 0x5f, 0x48, 0x49, 0x54, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, 0x72, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x43, 0x2f, 0x44, 0x20, + 0x68, 0x69, 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x39, 0x31, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, + 0x43, 0x44, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x22, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, 0x72, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x43, 0x2f, 0x44, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x32, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, + 0x4b, 0x5f, 0x41, 0x42, 0x5f, 0x44, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x48, + 0x49, 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, + 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x41, + 0x2f, 0x42, 0x20, 0x64, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x68, 0x69, + 0x74, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x39, 0x33, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, 0x41, 0x42, + 0x5f, 0x44, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, + 0x53, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, 0x72, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x41, 0x2f, + 0x42, 0x20, 0x64, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x34, 0x22, 0x20, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, + 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, + 0x5f, 0x43, 0x44, 0x5f, 0x44, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x48, 0x49, + 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, 0x72, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x43, 0x2f, + 0x44, 0x20, 0x64, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x68, 0x69, 0x74, + 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, + 0x78, 0x39, 0x35, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x44, 0x5f, + 0x44, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, 0x72, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x43, 0x2f, 0x44, + 0x20, 0x64, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x39, 0x36, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, + 0x41, 0x42, 0x5f, 0x49, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x48, 0x49, 0x54, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, 0x72, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x41, 0x2f, 0x42, + 0x20, 0x69, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, + 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, + 0x39, 0x37, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, + 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, 0x41, 0x42, 0x5f, 0x49, + 0x53, 0x49, 0x44, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, 0x72, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x41, 0x2f, 0x42, 0x20, + 0x69, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, + 0x22, 0x30, 0x78, 0x39, 0x38, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, 0x43, + 0x44, 0x5f, 0x49, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x48, 0x49, 0x54, 0x22, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, 0x72, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x43, 0x2f, 0x44, 0x20, + 0x69, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x68, 0x69, 0x74, 0x73, 0x22, + 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, + 0x39, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, + 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x44, 0x5f, 0x49, 0x53, + 0x49, 0x44, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x4c, 0x32, 0x20, 0x68, 0x69, 0x74, 0x20, 0x72, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x43, 0x2f, 0x44, 0x20, 0x69, + 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x39, 0x61, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x49, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x52, + 0x44, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x66, 0x69, 0x6c, + 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x73, 0x74, 0x6f, + 0x75, 0x74, 0x73, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x69, 0x2d, 0x73, 0x69, 0x64, 0x65, 0x20, 0x52, + 0x44, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x77, + 0x61, 0x69, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, 0x75, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x62, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x44, + 0x53, 0x49, 0x44, 0x45, 0x5f, 0x52, 0x44, 0x5f, 0x57, 0x41, 0x49, 0x54, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x63, 0x61, 0x73, 0x74, 0x6f, 0x75, 0x74, 0x73, 0x20, 0x63, 0x79, + 0x63, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x2d, + 0x73, 0x69, 0x64, 0x65, 0x20, 0x52, 0x44, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x20, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6f, 0x6e, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x62, + 0x75, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x39, 0x63, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, 0x42, 0x59, + 0x50, 0x41, 0x53, 0x53, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x22, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x66, 0x69, 0x6c, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, + 0x61, 0x73, 0x74, 0x6f, 0x75, 0x74, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, + 0x20, 0x62, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x30, 0x78, 0x39, 0x64, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, 0x41, 0x42, + 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x43, 0x41, 0x53, 0x54, 0x4f, 0x55, 0x54, + 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x63, 0x61, 0x73, 0x74, 0x6f, 0x75, 0x74, 0x73, 0x20, 0x62, 0x61, + 0x6e, 0x6b, 0x20, 0x41, 0x2f, 0x42, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, + 0x61, 0x73, 0x74, 0x6f, 0x75, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x75, 0x73, 0x22, 0x2f, 0x3e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x65, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, + 0x41, 0x4e, 0x4b, 0x5f, 0x41, 0x42, 0x5f, 0x4c, 0x32, 0x5f, 0x43, 0x41, + 0x53, 0x54, 0x4f, 0x55, 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x73, 0x74, 0x6f, 0x75, + 0x74, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x41, 0x2f, 0x42, 0x20, + 0x4c, 0x32, 0x20, 0x63, 0x61, 0x73, 0x74, 0x6f, 0x75, 0x74, 0x73, 0x20, + 0x28, 0x67, 0x72, 0x61, 0x6e, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x22, 0x2f, + 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x30, 0x78, 0x39, 0x66, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, + 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, 0x43, 0x44, 0x5f, 0x4e, 0x4f, 0x4e, + 0x5f, 0x43, 0x41, 0x53, 0x54, 0x4f, 0x55, 0x54, 0x22, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x66, + 0x69, 0x6c, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x73, + 0x74, 0x6f, 0x75, 0x74, 0x73, 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x43, + 0x2f, 0x44, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x73, 0x74, 0x6f, + 0x75, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x62, 0x75, 0x73, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x3c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x30, 0x78, 0x61, 0x30, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3d, 0x22, 0x53, 0x63, 0x6f, 0x72, 0x70, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x42, 0x41, 0x4e, 0x4b, 0x5f, + 0x43, 0x44, 0x5f, 0x4c, 0x32, 0x5f, 0x43, 0x41, 0x53, 0x54, 0x4f, 0x55, + 0x54, 0x22, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x63, 0x61, 0x73, 0x74, 0x6f, 0x75, 0x74, 0x73, 0x20, 0x62, + 0x61, 0x6e, 0x6b, 0x20, 0x43, 0x2f, 0x44, 0x20, 0x4c, 0x32, 0x20, 0x63, + 0x61, 0x73, 0x74, 0x6f, 0x75, 0x74, 0x73, 0x20, 0x28, 0x67, 0x72, 0x61, + 0x6e, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, + 0x3c, 0x2f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x3e, 0x0a, + 0x3c, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3e, 0x0a, 0x00 +}; +static const unsigned int events_xml_len = 240262; diff --git a/tools/gator/daemon/k/perf_event.3.12.h b/tools/gator/daemon/k/perf_event.3.12.h new file mode 100644 index 00000000..e886c48c --- /dev/null +++ b/tools/gator/daemon/k/perf_event.3.12.h @@ -0,0 +1,792 @@ +/* + * Performance events: + * + * Copyright (C) 2008-2009, Thomas Gleixner + * Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar + * Copyright (C) 2008-2011, Red Hat, Inc., Peter Zijlstra + * + * Data type definitions, declarations, prototypes. + * + * Started by: Thomas Gleixner and Ingo Molnar + * + * For licencing details see kernel-base/COPYING + */ +#ifndef _LINUX_PERF_EVENT_H +#define _LINUX_PERF_EVENT_H + +#include +#include +#include + +/* + * User-space ABI bits: + */ + +/* + * attr.type + */ +enum perf_type_id { + PERF_TYPE_HARDWARE = 0, + PERF_TYPE_SOFTWARE = 1, + PERF_TYPE_TRACEPOINT = 2, + PERF_TYPE_HW_CACHE = 3, + PERF_TYPE_RAW = 4, + PERF_TYPE_BREAKPOINT = 5, + + PERF_TYPE_MAX, /* non-ABI */ +}; + +/* + * Generalized performance event event_id types, used by the + * attr.event_id parameter of the sys_perf_event_open() + * syscall: + */ +enum perf_hw_id { + /* + * Common hardware events, generalized by the kernel: + */ + PERF_COUNT_HW_CPU_CYCLES = 0, + PERF_COUNT_HW_INSTRUCTIONS = 1, + PERF_COUNT_HW_CACHE_REFERENCES = 2, + PERF_COUNT_HW_CACHE_MISSES = 3, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, + PERF_COUNT_HW_BRANCH_MISSES = 5, + PERF_COUNT_HW_BUS_CYCLES = 6, + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, + PERF_COUNT_HW_REF_CPU_CYCLES = 9, + + PERF_COUNT_HW_MAX, /* non-ABI */ +}; + +/* + * Generalized hardware cache events: + * + * { L1-D, L1-I, LLC, ITLB, DTLB, BPU, NODE } x + * { read, write, prefetch } x + * { accesses, misses } + */ +enum perf_hw_cache_id { + PERF_COUNT_HW_CACHE_L1D = 0, + PERF_COUNT_HW_CACHE_L1I = 1, + PERF_COUNT_HW_CACHE_LL = 2, + PERF_COUNT_HW_CACHE_DTLB = 3, + PERF_COUNT_HW_CACHE_ITLB = 4, + PERF_COUNT_HW_CACHE_BPU = 5, + PERF_COUNT_HW_CACHE_NODE = 6, + + PERF_COUNT_HW_CACHE_MAX, /* non-ABI */ +}; + +enum perf_hw_cache_op_id { + PERF_COUNT_HW_CACHE_OP_READ = 0, + PERF_COUNT_HW_CACHE_OP_WRITE = 1, + PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, + + PERF_COUNT_HW_CACHE_OP_MAX, /* non-ABI */ +}; + +enum perf_hw_cache_op_result_id { + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, + PERF_COUNT_HW_CACHE_RESULT_MISS = 1, + + PERF_COUNT_HW_CACHE_RESULT_MAX, /* non-ABI */ +}; + +/* + * Special "software" events provided by the kernel, even if the hardware + * does not support performance events. These events measure various + * physical and sw events of the kernel (and allow the profiling of them as + * well): + */ +enum perf_sw_ids { + PERF_COUNT_SW_CPU_CLOCK = 0, + PERF_COUNT_SW_TASK_CLOCK = 1, + PERF_COUNT_SW_PAGE_FAULTS = 2, + PERF_COUNT_SW_CONTEXT_SWITCHES = 3, + PERF_COUNT_SW_CPU_MIGRATIONS = 4, + PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, + PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, + PERF_COUNT_SW_EMULATION_FAULTS = 8, + PERF_COUNT_SW_DUMMY = 9, + + PERF_COUNT_SW_MAX, /* non-ABI */ +}; + +/* + * Bits that can be set in attr.sample_type to request information + * in the overflow packets. + */ +enum perf_event_sample_format { + PERF_SAMPLE_IP = 1U << 0, + PERF_SAMPLE_TID = 1U << 1, + PERF_SAMPLE_TIME = 1U << 2, + PERF_SAMPLE_ADDR = 1U << 3, + PERF_SAMPLE_READ = 1U << 4, + PERF_SAMPLE_CALLCHAIN = 1U << 5, + PERF_SAMPLE_ID = 1U << 6, + PERF_SAMPLE_CPU = 1U << 7, + PERF_SAMPLE_PERIOD = 1U << 8, + PERF_SAMPLE_STREAM_ID = 1U << 9, + PERF_SAMPLE_RAW = 1U << 10, + PERF_SAMPLE_BRANCH_STACK = 1U << 11, + PERF_SAMPLE_REGS_USER = 1U << 12, + PERF_SAMPLE_STACK_USER = 1U << 13, + PERF_SAMPLE_WEIGHT = 1U << 14, + PERF_SAMPLE_DATA_SRC = 1U << 15, + PERF_SAMPLE_IDENTIFIER = 1U << 16, + + PERF_SAMPLE_MAX = 1U << 17, /* non-ABI */ +}; + +/* + * values to program into branch_sample_type when PERF_SAMPLE_BRANCH is set + * + * If the user does not pass priv level information via branch_sample_type, + * the kernel uses the event's priv level. Branch and event priv levels do + * not have to match. Branch priv level is checked for permissions. + * + * The branch types can be combined, however BRANCH_ANY covers all types + * of branches and therefore it supersedes all the other types. + */ +enum perf_branch_sample_type { + PERF_SAMPLE_BRANCH_USER = 1U << 0, /* user branches */ + PERF_SAMPLE_BRANCH_KERNEL = 1U << 1, /* kernel branches */ + PERF_SAMPLE_BRANCH_HV = 1U << 2, /* hypervisor branches */ + + PERF_SAMPLE_BRANCH_ANY = 1U << 3, /* any branch types */ + PERF_SAMPLE_BRANCH_ANY_CALL = 1U << 4, /* any call branch */ + PERF_SAMPLE_BRANCH_ANY_RETURN = 1U << 5, /* any return branch */ + PERF_SAMPLE_BRANCH_IND_CALL = 1U << 6, /* indirect calls */ + PERF_SAMPLE_BRANCH_ABORT_TX = 1U << 7, /* transaction aborts */ + PERF_SAMPLE_BRANCH_IN_TX = 1U << 8, /* in transaction */ + PERF_SAMPLE_BRANCH_NO_TX = 1U << 9, /* not in transaction */ + + PERF_SAMPLE_BRANCH_MAX = 1U << 10, /* non-ABI */ +}; + +#define PERF_SAMPLE_BRANCH_PLM_ALL \ + (PERF_SAMPLE_BRANCH_USER|\ + PERF_SAMPLE_BRANCH_KERNEL|\ + PERF_SAMPLE_BRANCH_HV) + +/* + * Values to determine ABI of the registers dump. + */ +enum perf_sample_regs_abi { + PERF_SAMPLE_REGS_ABI_NONE = 0, + PERF_SAMPLE_REGS_ABI_32 = 1, + PERF_SAMPLE_REGS_ABI_64 = 2, +}; + +/* + * The format of the data returned by read() on a perf event fd, + * as specified by attr.read_format: + * + * struct read_format { + * { u64 value; + * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED + * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING + * { u64 id; } && PERF_FORMAT_ID + * } && !PERF_FORMAT_GROUP + * + * { u64 nr; + * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED + * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING + * { u64 value; + * { u64 id; } && PERF_FORMAT_ID + * } cntr[nr]; + * } && PERF_FORMAT_GROUP + * }; + */ +enum perf_event_read_format { + PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0, + PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1, + PERF_FORMAT_ID = 1U << 2, + PERF_FORMAT_GROUP = 1U << 3, + + PERF_FORMAT_MAX = 1U << 4, /* non-ABI */ +}; + +#define PERF_ATTR_SIZE_VER0 64 /* sizeof first published struct */ +#define PERF_ATTR_SIZE_VER1 72 /* add: config2 */ +#define PERF_ATTR_SIZE_VER2 80 /* add: branch_sample_type */ +#define PERF_ATTR_SIZE_VER3 96 /* add: sample_regs_user */ + /* add: sample_stack_user */ + +/* + * Hardware event_id to monitor via a performance monitoring event: + */ +struct perf_event_attr { + + /* + * Major type: hardware/software/tracepoint/etc. + */ + __u32 type; + + /* + * Size of the attr structure, for fwd/bwd compat. + */ + __u32 size; + + /* + * Type specific configuration information. + */ + __u64 config; + + union { + __u64 sample_period; + __u64 sample_freq; + }; + + __u64 sample_type; + __u64 read_format; + + __u64 disabled : 1, /* off by default */ + inherit : 1, /* children inherit it */ + pinned : 1, /* must always be on PMU */ + exclusive : 1, /* only group on PMU */ + exclude_user : 1, /* don't count user */ + exclude_kernel : 1, /* ditto kernel */ + exclude_hv : 1, /* ditto hypervisor */ + exclude_idle : 1, /* don't count when idle */ + mmap : 1, /* include mmap data */ + comm : 1, /* include comm data */ + freq : 1, /* use freq, not period */ + inherit_stat : 1, /* per task counts */ + enable_on_exec : 1, /* next exec enables */ + task : 1, /* trace fork/exit */ + watermark : 1, /* wakeup_watermark */ + /* + * precise_ip: + * + * 0 - SAMPLE_IP can have arbitrary skid + * 1 - SAMPLE_IP must have constant skid + * 2 - SAMPLE_IP requested to have 0 skid + * 3 - SAMPLE_IP must have 0 skid + * + * See also PERF_RECORD_MISC_EXACT_IP + */ + precise_ip : 2, /* skid constraint */ + mmap_data : 1, /* non-exec mmap data */ + sample_id_all : 1, /* sample_type all events */ + + exclude_host : 1, /* don't count in host */ + exclude_guest : 1, /* don't count in guest */ + + exclude_callchain_kernel : 1, /* exclude kernel callchains */ + exclude_callchain_user : 1, /* exclude user callchains */ + mmap2 : 1, /* include mmap with inode data */ + + __reserved_1 : 40; + + union { + __u32 wakeup_events; /* wakeup every n events */ + __u32 wakeup_watermark; /* bytes before wakeup */ + }; + + __u32 bp_type; + union { + __u64 bp_addr; + __u64 config1; /* extension of config */ + }; + union { + __u64 bp_len; + __u64 config2; /* extension of config1 */ + }; + __u64 branch_sample_type; /* enum perf_branch_sample_type */ + + /* + * Defines set of user regs to dump on samples. + * See asm/perf_regs.h for details. + */ + __u64 sample_regs_user; + + /* + * Defines size of the user stack to dump on samples. + */ + __u32 sample_stack_user; + + /* Align to u64. */ + __u32 __reserved_2; +}; + +#define perf_flags(attr) (*(&(attr)->read_format + 1)) + +/* + * Ioctls that can be done on a perf event fd: + */ +#define PERF_EVENT_IOC_ENABLE _IO ('$', 0) +#define PERF_EVENT_IOC_DISABLE _IO ('$', 1) +#define PERF_EVENT_IOC_REFRESH _IO ('$', 2) +#define PERF_EVENT_IOC_RESET _IO ('$', 3) +#define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64) +#define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5) +#define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) +#define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *) + +enum perf_event_ioc_flags { + PERF_IOC_FLAG_GROUP = 1U << 0, +}; + +/* + * Structure of the page that can be mapped via mmap + */ +struct perf_event_mmap_page { + __u32 version; /* version number of this structure */ + __u32 compat_version; /* lowest version this is compat with */ + + /* + * Bits needed to read the hw events in user-space. + * + * u32 seq, time_mult, time_shift, idx, width; + * u64 count, enabled, running; + * u64 cyc, time_offset; + * s64 pmc = 0; + * + * do { + * seq = pc->lock; + * barrier() + * + * enabled = pc->time_enabled; + * running = pc->time_running; + * + * if (pc->cap_usr_time && enabled != running) { + * cyc = rdtsc(); + * time_offset = pc->time_offset; + * time_mult = pc->time_mult; + * time_shift = pc->time_shift; + * } + * + * idx = pc->index; + * count = pc->offset; + * if (pc->cap_usr_rdpmc && idx) { + * width = pc->pmc_width; + * pmc = rdpmc(idx - 1); + * } + * + * barrier(); + * } while (pc->lock != seq); + * + * NOTE: for obvious reason this only works on self-monitoring + * processes. + */ + __u32 lock; /* seqlock for synchronization */ + __u32 index; /* hardware event identifier */ + __s64 offset; /* add to hardware event value */ + __u64 time_enabled; /* time event active */ + __u64 time_running; /* time event on cpu */ + union { + __u64 capabilities; + struct { + __u64 cap_bit0 : 1, /* Always 0, deprecated, see commit 860f085b74e9 */ + cap_bit0_is_deprecated : 1, /* Always 1, signals that bit 0 is zero */ + + cap_user_rdpmc : 1, /* The RDPMC instruction can be used to read counts */ + cap_user_time : 1, /* The time_* fields are used */ + cap_user_time_zero : 1, /* The time_zero field is used */ + cap_____res : 59; + }; + }; + + /* + * If cap_usr_rdpmc this field provides the bit-width of the value + * read using the rdpmc() or equivalent instruction. This can be used + * to sign extend the result like: + * + * pmc <<= 64 - width; + * pmc >>= 64 - width; // signed shift right + * count += pmc; + */ + __u16 pmc_width; + + /* + * If cap_usr_time the below fields can be used to compute the time + * delta since time_enabled (in ns) using rdtsc or similar. + * + * u64 quot, rem; + * u64 delta; + * + * quot = (cyc >> time_shift); + * rem = cyc & ((1 << time_shift) - 1); + * delta = time_offset + quot * time_mult + + * ((rem * time_mult) >> time_shift); + * + * Where time_offset,time_mult,time_shift and cyc are read in the + * seqcount loop described above. This delta can then be added to + * enabled and possible running (if idx), improving the scaling: + * + * enabled += delta; + * if (idx) + * running += delta; + * + * quot = count / running; + * rem = count % running; + * count = quot * enabled + (rem * enabled) / running; + */ + __u16 time_shift; + __u32 time_mult; + __u64 time_offset; + /* + * If cap_usr_time_zero, the hardware clock (e.g. TSC) can be calculated + * from sample timestamps. + * + * time = timestamp - time_zero; + * quot = time / time_mult; + * rem = time % time_mult; + * cyc = (quot << time_shift) + (rem << time_shift) / time_mult; + * + * And vice versa: + * + * quot = cyc >> time_shift; + * rem = cyc & ((1 << time_shift) - 1); + * timestamp = time_zero + quot * time_mult + + * ((rem * time_mult) >> time_shift); + */ + __u64 time_zero; + __u32 size; /* Header size up to __reserved[] fields. */ + + /* + * Hole for extension of the self monitor capabilities + */ + + __u8 __reserved[118*8+4]; /* align to 1k. */ + + /* + * Control data for the mmap() data buffer. + * + * User-space reading the @data_head value should issue an smp_rmb(), + * after reading this value. + * + * When the mapping is PROT_WRITE the @data_tail value should be + * written by userspace to reflect the last read data, after issueing + * an smp_mb() to separate the data read from the ->data_tail store. + * In this case the kernel will not over-write unread data. + * + * See perf_output_put_handle() for the data ordering. + */ + __u64 data_head; /* head in the data section */ + __u64 data_tail; /* user-space written tail */ +}; + +#define PERF_RECORD_MISC_CPUMODE_MASK (7 << 0) +#define PERF_RECORD_MISC_CPUMODE_UNKNOWN (0 << 0) +#define PERF_RECORD_MISC_KERNEL (1 << 0) +#define PERF_RECORD_MISC_USER (2 << 0) +#define PERF_RECORD_MISC_HYPERVISOR (3 << 0) +#define PERF_RECORD_MISC_GUEST_KERNEL (4 << 0) +#define PERF_RECORD_MISC_GUEST_USER (5 << 0) + +#define PERF_RECORD_MISC_MMAP_DATA (1 << 13) +/* + * Indicates that the content of PERF_SAMPLE_IP points to + * the actual instruction that triggered the event. See also + * perf_event_attr::precise_ip. + */ +#define PERF_RECORD_MISC_EXACT_IP (1 << 14) +/* + * Reserve the last bit to indicate some extended misc field + */ +#define PERF_RECORD_MISC_EXT_RESERVED (1 << 15) + +struct perf_event_header { + __u32 type; + __u16 misc; + __u16 size; +}; + +enum perf_event_type { + + /* + * If perf_event_attr.sample_id_all is set then all event types will + * have the sample_type selected fields related to where/when + * (identity) an event took place (TID, TIME, ID, STREAM_ID, CPU, + * IDENTIFIER) described in PERF_RECORD_SAMPLE below, it will be stashed + * just after the perf_event_header and the fields already present for + * the existing fields, i.e. at the end of the payload. That way a newer + * perf.data file will be supported by older perf tools, with these new + * optional fields being ignored. + * + * struct sample_id { + * { u32 pid, tid; } && PERF_SAMPLE_TID + * { u64 time; } && PERF_SAMPLE_TIME + * { u64 id; } && PERF_SAMPLE_ID + * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID + * { u32 cpu, res; } && PERF_SAMPLE_CPU + * { u64 id; } && PERF_SAMPLE_IDENTIFIER + * } && perf_event_attr::sample_id_all + * + * Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. The + * advantage of PERF_SAMPLE_IDENTIFIER is that its position is fixed + * relative to header.size. + */ + + /* + * The MMAP events record the PROT_EXEC mappings so that we can + * correlate userspace IPs to code. They have the following structure: + * + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * u64 addr; + * u64 len; + * u64 pgoff; + * char filename[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_MMAP = 1, + + /* + * struct { + * struct perf_event_header header; + * u64 id; + * u64 lost; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_LOST = 2, + + /* + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * char comm[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_COMM = 3, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, ppid; + * u32 tid, ptid; + * u64 time; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_EXIT = 4, + + /* + * struct { + * struct perf_event_header header; + * u64 time; + * u64 id; + * u64 stream_id; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_THROTTLE = 5, + PERF_RECORD_UNTHROTTLE = 6, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, ppid; + * u32 tid, ptid; + * u64 time; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_FORK = 7, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, tid; + * + * struct read_format values; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_READ = 8, + + /* + * struct { + * struct perf_event_header header; + * + * # + * # Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. + * # The advantage of PERF_SAMPLE_IDENTIFIER is that its position + * # is fixed relative to header. + * # + * + * { u64 id; } && PERF_SAMPLE_IDENTIFIER + * { u64 ip; } && PERF_SAMPLE_IP + * { u32 pid, tid; } && PERF_SAMPLE_TID + * { u64 time; } && PERF_SAMPLE_TIME + * { u64 addr; } && PERF_SAMPLE_ADDR + * { u64 id; } && PERF_SAMPLE_ID + * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID + * { u32 cpu, res; } && PERF_SAMPLE_CPU + * { u64 period; } && PERF_SAMPLE_PERIOD + * + * { struct read_format values; } && PERF_SAMPLE_READ + * + * { u64 nr, + * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN + * + * # + * # The RAW record below is opaque data wrt the ABI + * # + * # That is, the ABI doesn't make any promises wrt to + * # the stability of its content, it may vary depending + * # on event, hardware, kernel version and phase of + * # the moon. + * # + * # In other words, PERF_SAMPLE_RAW contents are not an ABI. + * # + * + * { u32 size; + * char data[size];}&& PERF_SAMPLE_RAW + * + * { u64 nr; + * { u64 from, to, flags } lbr[nr];} && PERF_SAMPLE_BRANCH_STACK + * + * { u64 abi; # enum perf_sample_regs_abi + * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_USER + * + * { u64 size; + * char data[size]; + * u64 dyn_size; } && PERF_SAMPLE_STACK_USER + * + * { u64 weight; } && PERF_SAMPLE_WEIGHT + * { u64 data_src; } && PERF_SAMPLE_DATA_SRC + * }; + */ + PERF_RECORD_SAMPLE = 9, + + /* + * The MMAP2 records are an augmented version of MMAP, they add + * maj, min, ino numbers to be used to uniquely identify each mapping + * + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * u64 addr; + * u64 len; + * u64 pgoff; + * u32 maj; + * u32 min; + * u64 ino; + * u64 ino_generation; + * char filename[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_MMAP2 = 10, + + PERF_RECORD_MAX, /* non-ABI */ +}; + +#define PERF_MAX_STACK_DEPTH 127 + +enum perf_callchain_context { + PERF_CONTEXT_HV = (__u64)-32, + PERF_CONTEXT_KERNEL = (__u64)-128, + PERF_CONTEXT_USER = (__u64)-512, + + PERF_CONTEXT_GUEST = (__u64)-2048, + PERF_CONTEXT_GUEST_KERNEL = (__u64)-2176, + PERF_CONTEXT_GUEST_USER = (__u64)-2560, + + PERF_CONTEXT_MAX = (__u64)-4095, +}; + +#define PERF_FLAG_FD_NO_GROUP (1U << 0) +#define PERF_FLAG_FD_OUTPUT (1U << 1) +#define PERF_FLAG_PID_CGROUP (1U << 2) /* pid=cgroup id, per-cpu mode only */ + +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_op:5, /* type of opcode */ + mem_lvl:14, /* memory hierarchy level */ + mem_snoop:5, /* snoop mode */ + mem_lock:2, /* lock instr */ + mem_dtlb:7, /* tlb access */ + mem_rsvd:31; + }; +}; + +/* type of opcode (load/store/prefetch,code) */ +#define PERF_MEM_OP_NA 0x01 /* not available */ +#define PERF_MEM_OP_LOAD 0x02 /* load instruction */ +#define PERF_MEM_OP_STORE 0x04 /* store instruction */ +#define PERF_MEM_OP_PFETCH 0x08 /* prefetch */ +#define PERF_MEM_OP_EXEC 0x10 /* code (execution) */ +#define PERF_MEM_OP_SHIFT 0 + +/* memory hierarchy (memory level, hit or miss) */ +#define PERF_MEM_LVL_NA 0x01 /* not available */ +#define PERF_MEM_LVL_HIT 0x02 /* hit level */ +#define PERF_MEM_LVL_MISS 0x04 /* miss level */ +#define PERF_MEM_LVL_L1 0x08 /* L1 */ +#define PERF_MEM_LVL_LFB 0x10 /* Line Fill Buffer */ +#define PERF_MEM_LVL_L2 0x20 /* L2 */ +#define PERF_MEM_LVL_L3 0x40 /* L3 */ +#define PERF_MEM_LVL_LOC_RAM 0x80 /* Local DRAM */ +#define PERF_MEM_LVL_REM_RAM1 0x100 /* Remote DRAM (1 hop) */ +#define PERF_MEM_LVL_REM_RAM2 0x200 /* Remote DRAM (2 hops) */ +#define PERF_MEM_LVL_REM_CCE1 0x400 /* Remote Cache (1 hop) */ +#define PERF_MEM_LVL_REM_CCE2 0x800 /* Remote Cache (2 hops) */ +#define PERF_MEM_LVL_IO 0x1000 /* I/O memory */ +#define PERF_MEM_LVL_UNC 0x2000 /* Uncached memory */ +#define PERF_MEM_LVL_SHIFT 5 + +/* snoop mode */ +#define PERF_MEM_SNOOP_NA 0x01 /* not available */ +#define PERF_MEM_SNOOP_NONE 0x02 /* no snoop */ +#define PERF_MEM_SNOOP_HIT 0x04 /* snoop hit */ +#define PERF_MEM_SNOOP_MISS 0x08 /* snoop miss */ +#define PERF_MEM_SNOOP_HITM 0x10 /* snoop hit modified */ +#define PERF_MEM_SNOOP_SHIFT 19 + +/* locked instruction */ +#define PERF_MEM_LOCK_NA 0x01 /* not available */ +#define PERF_MEM_LOCK_LOCKED 0x02 /* locked transaction */ +#define PERF_MEM_LOCK_SHIFT 24 + +/* TLB access */ +#define PERF_MEM_TLB_NA 0x01 /* not available */ +#define PERF_MEM_TLB_HIT 0x02 /* hit level */ +#define PERF_MEM_TLB_MISS 0x04 /* miss level */ +#define PERF_MEM_TLB_L1 0x08 /* L1 */ +#define PERF_MEM_TLB_L2 0x10 /* L2 */ +#define PERF_MEM_TLB_WK 0x20 /* Hardware Walker*/ +#define PERF_MEM_TLB_OS 0x40 /* OS fault handler */ +#define PERF_MEM_TLB_SHIFT 26 + +#define PERF_MEM_S(a, s) \ + (((u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT) + +/* + * single taken branch record layout: + * + * from: source instruction (may not always be a branch insn) + * to: branch target + * mispred: branch target was mispredicted + * predicted: branch target was predicted + * + * support for mispred, predicted is optional. In case it + * is not supported mispred = predicted = 0. + * + * in_tx: running in a hardware transaction + * abort: aborting a hardware transaction + */ +struct perf_branch_entry { + __u64 from; + __u64 to; + __u64 mispred:1, /* target mispredicted */ + predicted:1,/* target predicted */ + in_tx:1, /* in transaction */ + abort:1, /* transaction abort */ + reserved:60; +}; + +#endif /* _LINUX_PERF_EVENT_H */ diff --git a/tools/gator/daemon/k/perf_event.h b/tools/gator/daemon/k/perf_event.h new file mode 120000 index 00000000..e5dff8c2 --- /dev/null +++ b/tools/gator/daemon/k/perf_event.h @@ -0,0 +1 @@ +perf_event.3.12.h \ No newline at end of file diff --git a/tools/gator/daemon/libsensors/COPYING.LGPL b/tools/gator/daemon/libsensors/COPYING.LGPL new file mode 100644 index 00000000..4362b491 --- /dev/null +++ b/tools/gator/daemon/libsensors/COPYING.LGPL @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 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. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete 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 distribute a copy of this License along with the +Library. + + 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 Library or any portion +of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +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 Library, 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 Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be 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. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library 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. + + 9. 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 Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +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 with +this License. + + 11. 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 Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library 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 Library. + +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. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library 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. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +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 Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. 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 LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; 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. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/tools/gator/daemon/libsensors/access.c b/tools/gator/daemon/libsensors/access.c new file mode 100644 index 00000000..8e227e25 --- /dev/null +++ b/tools/gator/daemon/libsensors/access.c @@ -0,0 +1,561 @@ +/* + access.c - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + Copyright (C) 2007-2009 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#include +#include +#include +#include "access.h" +#include "sensors.h" +#include "data.h" +#include "error.h" +#include "sysfs.h" + +/* We watch the recursion depth for variables only, as an easy way to + detect cycles. */ +#define DEPTH_MAX 8 + +static int sensors_eval_expr(const sensors_chip_features *chip_features, + const sensors_expr *expr, + double val, int depth, double *result); + +/* Compare two chips name descriptions, to see whether they could match. + Return 0 if it does not match, return 1 if it does match. */ +static int sensors_match_chip(const sensors_chip_name *chip1, + const sensors_chip_name *chip2) +{ + if ((chip1->prefix != SENSORS_CHIP_NAME_PREFIX_ANY) && + (chip2->prefix != SENSORS_CHIP_NAME_PREFIX_ANY) && + strcmp(chip1->prefix, chip2->prefix)) + return 0; + + if ((chip1->bus.type != SENSORS_BUS_TYPE_ANY) && + (chip2->bus.type != SENSORS_BUS_TYPE_ANY) && + (chip1->bus.type != chip2->bus.type)) + return 0; + + if ((chip1->bus.nr != SENSORS_BUS_NR_ANY) && + (chip2->bus.nr != SENSORS_BUS_NR_ANY) && + (chip1->bus.nr != chip2->bus.nr)) + return 0; + + if ((chip1->addr != chip2->addr) && + (chip1->addr != SENSORS_CHIP_NAME_ADDR_ANY) && + (chip2->addr != SENSORS_CHIP_NAME_ADDR_ANY)) + return 0; + + return 1; +} + +/* Returns, one by one, a pointer to all sensor_chip structs of the + config file which match with the given chip name. Last should be + the value returned by the last call, or NULL if this is the first + call. Returns NULL if no more matches are found. Do not modify + the struct the return value points to! + Note that this visits the list of chips from last to first. Usually, + you want the match that was latest in the config file. */ +static sensors_chip * +sensors_for_all_config_chips(const sensors_chip_name *name, + const sensors_chip *last) +{ + int nr, i; + sensors_chip_name_list chips; + + for (nr = last ? last - sensors_config_chips - 1 : + sensors_config_chips_count - 1; nr >= 0; nr--) { + + chips = sensors_config_chips[nr].chips; + for (i = 0; i < chips.fits_count; i++) { + if (sensors_match_chip(&chips.fits[i], name)) + return sensors_config_chips + nr; + } + } + return NULL; +} + +/* Look up a chip in the intern chip list, and return a pointer to it. + Do not modify the struct the return value points to! Returns NULL if + not found.*/ +static const sensors_chip_features * +sensors_lookup_chip(const sensors_chip_name *name) +{ + int i; + + for (i = 0; i < sensors_proc_chips_count; i++) + if (sensors_match_chip(&sensors_proc_chips[i].chip, name)) + return &sensors_proc_chips[i]; + + return NULL; +} + +/* Look up a subfeature of the given chip, and return a pointer to it. + Do not modify the struct the return value points to! Returns NULL if + not found.*/ +static const sensors_subfeature * +sensors_lookup_subfeature_nr(const sensors_chip_features *chip, + int subfeat_nr) +{ + if (subfeat_nr < 0 || + subfeat_nr >= chip->subfeature_count) + return NULL; + return chip->subfeature + subfeat_nr; +} + +/* Look up a feature of the given chip, and return a pointer to it. + Do not modify the struct the return value points to! Returns NULL if + not found.*/ +static const sensors_feature * +sensors_lookup_feature_nr(const sensors_chip_features *chip, int feat_nr) +{ + if (feat_nr < 0 || + feat_nr >= chip->feature_count) + return NULL; + return chip->feature + feat_nr; +} + +/* Look up a subfeature by name, and return a pointer to it. + Do not modify the struct the return value points to! Returns NULL if + not found.*/ +static const sensors_subfeature * +sensors_lookup_subfeature_name(const sensors_chip_features *chip, + const char *name) +{ + int j; + + for (j = 0; j < chip->subfeature_count; j++) + if (!strcmp(chip->subfeature[j].name, name)) + return chip->subfeature + j; + return NULL; +} + +/* Check whether the chip name is an 'absolute' name, which can only match + one chip, or whether it has wildcards. Returns 0 if it is absolute, 1 + if there are wildcards. */ +int sensors_chip_name_has_wildcards(const sensors_chip_name *chip) +{ + if ((chip->prefix == SENSORS_CHIP_NAME_PREFIX_ANY) || + (chip->bus.type == SENSORS_BUS_TYPE_ANY) || + (chip->bus.nr == SENSORS_BUS_NR_ANY) || + (chip->addr == SENSORS_CHIP_NAME_ADDR_ANY)) + return 1; + else + return 0; +} + +/* Look up the label for a given feature. Note that chip should not + contain wildcard values! The returned string is newly allocated (free it + yourself). On failure, NULL is returned. + If no label exists for this feature, its name is returned itself. */ +char *sensors_get_label(const sensors_chip_name *name, + const sensors_feature *feature) +{ + char *label; + const sensors_chip *chip; + char buf[PATH_MAX]; + FILE *f; + int i; + + if (sensors_chip_name_has_wildcards(name)) + return NULL; + + for (chip = NULL; (chip = sensors_for_all_config_chips(name, chip));) + for (i = 0; i < chip->labels_count; i++) + if (!strcmp(feature->name, chip->labels[i].name)) { + label = chip->labels[i].value; + goto sensors_get_label_exit; + } + + /* No user specified label, check for a _label sysfs file */ + snprintf(buf, PATH_MAX, "%s/%s_label", name->path, feature->name); + + if ((f = fopen(buf, "r"))) { + i = fread(buf, 1, sizeof(buf), f); + fclose(f); + if (i > 0) { + /* i - 1 to strip the '\n' at the end */ + buf[i - 1] = 0; + label = buf; + goto sensors_get_label_exit; + } + } + + /* No label, return the feature name instead */ + label = feature->name; + +sensors_get_label_exit: + label = strdup(label); + if (!label) + sensors_fatal_error(__func__, "Allocating label text"); + return label; +} + +/* Looks up whether a feature should be ignored. Returns + 1 if it should be ignored, 0 if not. */ +static int sensors_get_ignored(const sensors_chip_name *name, + const sensors_feature *feature) +{ + const sensors_chip *chip; + int i; + + for (chip = NULL; (chip = sensors_for_all_config_chips(name, chip));) + for (i = 0; i < chip->ignores_count; i++) + if (!strcmp(feature->name, chip->ignores[i].name)) + return 1; + return 0; +} + +/* Read the value of a subfeature of a certain chip. Note that chip should not + contain wildcard values! This function will return 0 on success, and <0 + on failure. */ +static int __sensors_get_value(const sensors_chip_name *name, int subfeat_nr, + int depth, double *result) +{ + const sensors_chip_features *chip_features; + const sensors_subfeature *subfeature; + const sensors_expr *expr = NULL; + double val; + int res, i; + + if (depth >= DEPTH_MAX) + return -SENSORS_ERR_RECURSION; + if (sensors_chip_name_has_wildcards(name)) + return -SENSORS_ERR_WILDCARDS; + if (!(chip_features = sensors_lookup_chip(name))) + return -SENSORS_ERR_NO_ENTRY; + if (!(subfeature = sensors_lookup_subfeature_nr(chip_features, + subfeat_nr))) + return -SENSORS_ERR_NO_ENTRY; + if (!(subfeature->flags & SENSORS_MODE_R)) + return -SENSORS_ERR_ACCESS_R; + + /* Apply compute statement if it exists */ + if (subfeature->flags & SENSORS_COMPUTE_MAPPING) { + const sensors_feature *feature; + const sensors_chip *chip; + + feature = sensors_lookup_feature_nr(chip_features, + subfeature->mapping); + + chip = NULL; + while (!expr && + (chip = sensors_for_all_config_chips(name, chip))) + for (i = 0; i < chip->computes_count; i++) { + if (!strcmp(feature->name, + chip->computes[i].name)) { + expr = chip->computes[i].from_proc; + break; + } + } + } + + res = sensors_read_sysfs_attr(name, subfeature, &val); + if (res) + return res; + if (!expr) + *result = val; + else if ((res = sensors_eval_expr(chip_features, expr, val, depth, + result))) + return res; + return 0; +} + +int sensors_get_value(const sensors_chip_name *name, int subfeat_nr, + double *result) +{ + return __sensors_get_value(name, subfeat_nr, 0, result); +} + +/* Set the value of a subfeature of a certain chip. Note that chip should not + contain wildcard values! This function will return 0 on success, and <0 + on failure. */ +int sensors_set_value(const sensors_chip_name *name, int subfeat_nr, + double value) +{ + const sensors_chip_features *chip_features; + const sensors_subfeature *subfeature; + const sensors_expr *expr = NULL; + int i, res; + double to_write; + + if (sensors_chip_name_has_wildcards(name)) + return -SENSORS_ERR_WILDCARDS; + if (!(chip_features = sensors_lookup_chip(name))) + return -SENSORS_ERR_NO_ENTRY; + if (!(subfeature = sensors_lookup_subfeature_nr(chip_features, + subfeat_nr))) + return -SENSORS_ERR_NO_ENTRY; + if (!(subfeature->flags & SENSORS_MODE_W)) + return -SENSORS_ERR_ACCESS_W; + + /* Apply compute statement if it exists */ + if (subfeature->flags & SENSORS_COMPUTE_MAPPING) { + const sensors_feature *feature; + const sensors_chip *chip; + + feature = sensors_lookup_feature_nr(chip_features, + subfeature->mapping); + + chip = NULL; + while (!expr && + (chip = sensors_for_all_config_chips(name, chip))) + for (i = 0; i < chip->computes_count; i++) { + if (!strcmp(feature->name, + chip->computes[i].name)) { + expr = chip->computes[i].to_proc; + break; + } + } + } + + to_write = value; + if (expr) + if ((res = sensors_eval_expr(chip_features, expr, + value, 0, &to_write))) + return res; + return sensors_write_sysfs_attr(name, subfeature, to_write); +} + +const sensors_chip_name *sensors_get_detected_chips(const sensors_chip_name + *match, int *nr) +{ + const sensors_chip_name *res; + + while (*nr < sensors_proc_chips_count) { + res = &sensors_proc_chips[(*nr)++].chip; + if (!match || sensors_match_chip(res, match)) + return res; + } + return NULL; +} + +const char *sensors_get_adapter_name(const sensors_bus_id *bus) +{ + int i; + + /* bus types with a single instance */ + switch (bus->type) { + case SENSORS_BUS_TYPE_ISA: + return "ISA adapter"; + case SENSORS_BUS_TYPE_PCI: + return "PCI adapter"; + /* SPI should not be here, but for now SPI adapters have no name + so we don't have any custom string to return. */ + case SENSORS_BUS_TYPE_SPI: + return "SPI adapter"; + case SENSORS_BUS_TYPE_VIRTUAL: + return "Virtual device"; + case SENSORS_BUS_TYPE_ACPI: + return "ACPI interface"; + /* HID should probably not be there either, but I don't know if + HID buses have a name nor where to find it. */ + case SENSORS_BUS_TYPE_HID: + return "HID adapter"; + } + + /* bus types with several instances */ + for (i = 0; i < sensors_proc_bus_count; i++) + if (sensors_proc_bus[i].bus.type == bus->type && + sensors_proc_bus[i].bus.nr == bus->nr) + return sensors_proc_bus[i].adapter; + return NULL; +} + +const sensors_feature * +sensors_get_features(const sensors_chip_name *name, int *nr) +{ + const sensors_chip_features *chip; + + if (!(chip = sensors_lookup_chip(name))) + return NULL; /* No such chip */ + + while (*nr < chip->feature_count + && sensors_get_ignored(name, &chip->feature[*nr])) + (*nr)++; + if (*nr >= chip->feature_count) + return NULL; + return &chip->feature[(*nr)++]; +} + +const sensors_subfeature * +sensors_get_all_subfeatures(const sensors_chip_name *name, + const sensors_feature *feature, int *nr) +{ + const sensors_chip_features *chip; + const sensors_subfeature *subfeature; + + if (!(chip = sensors_lookup_chip(name))) + return NULL; /* No such chip */ + + /* Seek directly to the first subfeature */ + if (*nr < feature->first_subfeature) + *nr = feature->first_subfeature; + + if (*nr >= chip->subfeature_count) + return NULL; /* end of list */ + subfeature = &chip->subfeature[(*nr)++]; + if (subfeature->mapping == feature->number) + return subfeature; + return NULL; /* end of subfeature list */ +} + +const sensors_subfeature * +sensors_get_subfeature(const sensors_chip_name *name, + const sensors_feature *feature, + sensors_subfeature_type type) +{ + const sensors_chip_features *chip; + int i; + + if (!(chip = sensors_lookup_chip(name))) + return NULL; /* No such chip */ + + for (i = feature->first_subfeature; i < chip->subfeature_count && + chip->subfeature[i].mapping == feature->number; i++) { + if (chip->subfeature[i].type == type) + return &chip->subfeature[i]; + } + return NULL; /* No such subfeature */ +} + +/* Evaluate an expression */ +int sensors_eval_expr(const sensors_chip_features *chip_features, + const sensors_expr *expr, + double val, int depth, double *result) +{ + double res1, res2; + int res; + const sensors_subfeature *subfeature; + + if (expr->kind == sensors_kind_val) { + *result = expr->data.val; + return 0; + } + if (expr->kind == sensors_kind_source) { + *result = val; + return 0; + } + if (expr->kind == sensors_kind_var) { + if (!(subfeature = sensors_lookup_subfeature_name(chip_features, + expr->data.var))) + return -SENSORS_ERR_NO_ENTRY; + return __sensors_get_value(&chip_features->chip, + subfeature->number, depth + 1, + result); + } + if ((res = sensors_eval_expr(chip_features, expr->data.subexpr.sub1, + val, depth, &res1))) + return res; + if (expr->data.subexpr.sub2 && + (res = sensors_eval_expr(chip_features, expr->data.subexpr.sub2, + val, depth, &res2))) + return res; + switch (expr->data.subexpr.op) { + case sensors_add: + *result = res1 + res2; + return 0; + case sensors_sub: + *result = res1 - res2; + return 0; + case sensors_multiply: + *result = res1 * res2; + return 0; + case sensors_divide: + if (res2 == 0.0) + return -SENSORS_ERR_DIV_ZERO; + *result = res1 / res2; + return 0; + case sensors_negate: + *result = -res1; + return 0; + case sensors_exp: + *result = exp(res1); + return 0; + case sensors_log: + if (res1 < 0.0) + return -SENSORS_ERR_DIV_ZERO; + *result = log(res1); + return 0; + } + return 0; +} + +/* Execute all set statements for this particular chip. The chip may not + contain wildcards! This function will return 0 on success, and <0 on + failure. */ +static int sensors_do_this_chip_sets(const sensors_chip_name *name) +{ + const sensors_chip_features *chip_features; + sensors_chip *chip; + double value; + int i; + int err = 0, res; + const sensors_subfeature *subfeature; + + chip_features = sensors_lookup_chip(name); /* Can't fail */ + + for (chip = NULL; (chip = sensors_for_all_config_chips(name, chip));) + for (i = 0; i < chip->sets_count; i++) { + subfeature = sensors_lookup_subfeature_name(chip_features, + chip->sets[i].name); + if (!subfeature) { + sensors_parse_error_wfn("Unknown feature name", + chip->sets[i].line.filename, + chip->sets[i].line.lineno); + err = -SENSORS_ERR_NO_ENTRY; + continue; + } + + res = sensors_eval_expr(chip_features, + chip->sets[i].value, 0, + 0, &value); + if (res) { + sensors_parse_error_wfn("Error parsing expression", + chip->sets[i].line.filename, + chip->sets[i].line.lineno); + err = res; + continue; + } + if ((res = sensors_set_value(name, subfeature->number, + value))) { + sensors_parse_error_wfn("Failed to set value", + chip->sets[i].line.filename, + chip->sets[i].line.lineno); + err = res; + continue; + } + } + return err; +} + +/* Execute all set statements for this particular chip. The chip may contain + wildcards! This function will return 0 on success, and <0 on failure. */ +int sensors_do_chip_sets(const sensors_chip_name *name) +{ + int nr, this_res; + const sensors_chip_name *found_name; + int res = 0; + + for (nr = 0; (found_name = sensors_get_detected_chips(name, &nr));) { + this_res = sensors_do_this_chip_sets(found_name); + if (this_res) + res = this_res; + } + return res; +} diff --git a/tools/gator/daemon/libsensors/access.h b/tools/gator/daemon/libsensors/access.h new file mode 100644 index 00000000..1d378434 --- /dev/null +++ b/tools/gator/daemon/libsensors/access.h @@ -0,0 +1,33 @@ +/* + access.h - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + Copyright (C) 2007 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#ifndef LIB_SENSORS_ACCESS_H +#define LIB_SENSORS_ACCESS_H + +#include "sensors.h" +#include "data.h" + +/* Check whether the chip name is an 'absolute' name, which can only match + one chip, or whether it has wildcards. Returns 0 if it is absolute, 1 + if there are wildcards. */ +int sensors_chip_name_has_wildcards(const sensors_chip_name *chip); + +#endif /* def LIB_SENSORS_ACCESS_H */ diff --git a/tools/gator/daemon/libsensors/conf-lex.c b/tools/gator/daemon/libsensors/conf-lex.c new file mode 100644 index 00000000..a54664b3 --- /dev/null +++ b/tools/gator/daemon/libsensors/conf-lex.c @@ -0,0 +1,2881 @@ + +#line 3 "" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define yy_create_buffer sensors_yy_create_buffer +#define yy_delete_buffer sensors_yy_delete_buffer +#define yy_flex_debug sensors_yy_flex_debug +#define yy_init_buffer sensors_yy_init_buffer +#define yy_flush_buffer sensors_yy_flush_buffer +#define yy_load_buffer_state sensors_yy_load_buffer_state +#define yy_switch_to_buffer sensors_yy_switch_to_buffer +#define yyin sensors_yyin +#define yyleng sensors_yyleng +#define yylex sensors_yylex +#define yylineno sensors_yylineno +#define yyout sensors_yyout +#define yyrestart sensors_yyrestart +#define yytext sensors_yytext +#define yywrap sensors_yywrap +#define yyalloc sensors_yyalloc +#define yyrealloc sensors_yyrealloc +#define yyfree sensors_yyfree + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE sensors_yyrestart(sensors_yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int sensors_yyleng; + +extern FILE *sensors_yyin, *sensors_yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up sensors_yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up sensors_yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via sensors_yyrestart()), so that the user can continue scanning by + * just pointing sensors_yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when sensors_yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int sensors_yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow sensors_yywrap()'s to do buffer switches + * instead of setting up a fresh sensors_yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void sensors_yyrestart (FILE *input_file ); +void sensors_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE sensors_yy_create_buffer (FILE *file,int size ); +void sensors_yy_delete_buffer (YY_BUFFER_STATE b ); +void sensors_yy_flush_buffer (YY_BUFFER_STATE b ); +void sensors_yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void sensors_yypop_buffer_state (void ); + +static void sensors_yyensure_buffer_stack (void ); +static void sensors_yy_load_buffer_state (void ); +static void sensors_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER sensors_yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE sensors_yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE sensors_yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE sensors_yy_scan_bytes (yyconst char *bytes,int len ); + +void *sensors_yyalloc (yy_size_t ); +void *sensors_yyrealloc (void *,yy_size_t ); +void sensors_yyfree (void * ); + +#define yy_new_buffer sensors_yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + sensors_yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + sensors_yy_create_buffer(sensors_yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + sensors_yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + sensors_yy_create_buffer(sensors_yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define sensors_yywrap(n) 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +FILE *sensors_yyin = (FILE *) 0, *sensors_yyout = (FILE *) 0; + +typedef int yy_state_type; + +extern int sensors_yylineno; + +int sensors_yylineno = 1; + +extern char *sensors_yytext; +#define yytext_ptr sensors_yytext +static yyconst flex_int16_t yy_nxt[][39] = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + + { + 9, 10, 11, 12, 10, 13, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 14, 15, 16, 14, 14, 14, 14, 14, 17, 18, + 14, 14, 14, 14, 14, 19, 14, 14, 14 + }, + + { + 9, 10, 11, 12, 10, 13, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + + 14, 15, 16, 14, 14, 14, 14, 14, 17, 18, + 14, 14, 14, 14, 14, 19, 14, 14, 14 + }, + + { + 9, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35 + }, + + { + 9, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35 + + }, + + { + 9, 39, 39, 40, 41, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 42, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39 + }, + + { + 9, 39, 39, 40, 41, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 42, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39 + }, + + { + 9, 43, 43, 44, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43 + }, + + { + 9, 43, 43, 44, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43 + }, + + { + -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, + -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, + -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, + -9, -9, -9, -9, -9, -9, -9, -9, -9 + + }, + + { + 9, -10, -10, -10, -10, -10, -10, -10, -10, -10, + -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, + -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, + -10, -10, -10, -10, -10, -10, -10, -10, -10 + }, + + { + 9, -11, 45, 46, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11, -11 + }, + + { + 9, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12 + }, + + { + 9, 47, 47, 48, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47 + }, + + { + 9, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + + }, + + { + 9, -15, -15, -15, -15, -15, -15, -15, -15, -15, + -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 50, 49 + }, + + { + 9, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + 49, 49, 49, 49, 49, 49, 49, 51, 49, 49, + 49, 49, 52, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -17, -17, -17, -17, -17, -17, -17, -17, -17, + -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, + + 49, 49, 49, 49, 49, 49, 53, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + 54, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -19, -19, -19, -19, -19, -19, -19, -19, -19, + -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, + 49, 49, 49, 49, 55, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + + }, + + { + 9, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20 + }, + + { + 9, -21, 56, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21, -21 + }, + + { + 9, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22 + }, + + { + 9, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, -23, -23, -23, -23, -23, -23 + }, + + { + 9, 57, 57, 58, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57 + + }, + + { + 9, -25, -25, -25, -25, -25, -25, -25, -25, -25, + -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, + -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, + -25, -25, -25, -25, -25, -25, -25, -25, -25 + }, + + { + 9, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26, -26 + }, + + { + 9, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, -27 + }, + + { + 9, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28 + }, + + { + 9, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, -29, -29, -29, -29, -29, -29 + + }, + + { + 9, -30, -30, -30, -30, -30, -30, -30, -30, -30, + -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, + -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, + -30, -30, -30, -30, -30, -30, -30, -30, -30 + }, + + { + 9, -31, -31, -31, -31, -31, -31, -31, -31, -31, + -31, -31, -31, -31, 59, -31, -31, -31, -31, -31, + -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, + -31, -31, -31, -31, -31, -31, -31, -31, -31 + }, + + { + 9, -32, -32, -32, -32, -32, -32, -32, -32, -32, + -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, + + -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, + -32, -32, -32, -32, -32, -32, -32, -32, -32 + }, + + { + 9, -33, -33, -33, -33, -33, -33, -33, -33, -33, + -33, -33, 60, -33, 61, -33, 62, -33, -33, -33, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62 + }, + + { + 9, -34, -34, -34, -34, -34, -34, -34, -34, -34, + -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, + -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, + -34, -34, -34, -34, -34, -34, -34, -34, -34 + + }, + + { + 9, -35, -35, -35, -35, -35, -35, -35, -35, -35, + -35, -35, -35, -35, 62, -35, 62, -35, -35, -35, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62 + }, + + { + 9, -36, 63, 64, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36, -36, -36 + }, + + { + 9, -37, -37, -37, -37, -37, -37, -37, -37, -37, + -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, + + -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, + -37, -37, -37, -37, -37, -37, -37, -37, -37 + }, + + { + 9, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, -38, -38, -38 + }, + + { + 9, 65, 65, -39, -39, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, -39, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65 + + }, + + { + 9, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40, -40, -40 + }, + + { + 9, -41, -41, -41, 66, -41, -41, -41, -41, -41, + -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, + -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, + -41, -41, -41, -41, -41, -41, -41, -41, -41 + }, + + { + 9, 67, 67, 68, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + + 69, 70, 67, 67, 67, 71, 67, 67, 67, 67, + 67, 72, 67, 67, 73, 67, 74, 67, 75 + }, + + { + 9, 76, 76, -43, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76 + }, + + { + 9, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, -44, -44, -44, -44, -44, -44 + + }, + + { + 9, -45, 45, 46, -45, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45, -45 + }, + + { + 9, -46, -46, -46, -46, -46, -46, -46, -46, -46, + -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, + -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, + -46, -46, -46, -46, -46, -46, -46, -46, -46 + }, + + { + 9, 47, 47, 48, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47 + }, + + { + 9, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48, -48, -48 + }, + + { + 9, -49, -49, -49, -49, -49, -49, -49, -49, -49, + -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + + }, + + { + 9, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 77, 49, 49, 49 + }, + + { + 9, -51, -51, -51, -51, -51, -51, -51, -51, -51, + -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, + 49, 49, 49, 49, 49, 49, 49, 49, 78, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -52, -52, -52, -52, -52, -52, -52, -52, -52, + -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, + + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 79, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -53, -53, -53, -53, -53, -53, -53, -53, -53, + -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 80, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -54, -54, -54, -54, -54, -54, -54, -54, -54, + -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, + 49, 81, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + + }, + + { + 9, -55, -55, -55, -55, -55, -55, -55, -55, -55, + -55, -55, -55, -55, -55, -55, -55, -55, -55, -55, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 82, 49, 49 + }, + + { + 9, -56, 56, -56, -56, -56, -56, -56, -56, -56, + -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, + -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, + -56, -56, -56, -56, -56, -56, -56, -56, -56 + }, + + { + 9, 57, 57, 58, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57 + }, + + { + 9, -58, -58, -58, -58, -58, -58, -58, -58, -58, + -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, + -58, -58, -58, -58, -58, -58, -58, -58, -58, -58, + -58, -58, -58, -58, -58, -58, -58, -58, -58 + }, + + { + 9, -59, -59, -59, -59, -59, -59, -59, -59, -59, + -59, -59, -59, -59, 59, -59, -59, -59, -59, -59, + -59, -59, -59, -59, -59, -59, -59, -59, -59, -59, + -59, -59, -59, -59, -59, -59, -59, -59, -59 + + }, + + { + 9, -60, -60, -60, -60, -60, -60, -60, -60, -60, + -60, -60, -60, -60, 59, -60, -60, -60, -60, -60, + -60, -60, -60, -60, -60, -60, -60, -60, -60, -60, + -60, -60, -60, -60, -60, -60, -60, -60, -60 + }, + + { + 9, -61, -61, -61, -61, -61, -61, -61, -61, -61, + -61, -61, 60, -61, 61, -61, 62, -61, -61, -61, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62 + }, + + { + 9, -62, -62, -62, -62, -62, -62, -62, -62, -62, + -62, -62, -62, -62, 62, -62, 62, -62, -62, -62, + + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62 + }, + + { + 9, -63, 63, 64, -63, -63, -63, -63, -63, -63, + -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, + -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, + -63, -63, -63, -63, -63, -63, -63, -63, -63 + }, + + { + 9, -64, -64, -64, -64, -64, -64, -64, -64, -64, + -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, + -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, + -64, -64, -64, -64, -64, -64, -64, -64, -64 + + }, + + { + 9, 65, 65, -65, -65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, -65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65 + }, + + { + 9, -66, -66, -66, -66, -66, -66, -66, -66, -66, + -66, -66, -66, -66, -66, -66, -66, -66, -66, -66, + -66, -66, -66, -66, -66, -66, -66, -66, -66, -66, + -66, -66, -66, -66, -66, -66, -66, -66, -66 + }, + + { + 9, -67, -67, -67, -67, -67, -67, -67, -67, -67, + -67, -67, -67, -67, -67, -67, -67, -67, -67, -67, + + -67, -67, -67, -67, -67, -67, -67, -67, -67, -67, + -67, -67, -67, -67, -67, -67, -67, -67, -67 + }, + + { + 9, -68, -68, -68, -68, -68, -68, -68, -68, -68, + -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, + -68, -68, -68, -68, -68, -68, -68, -68, -68, -68, + -68, -68, -68, -68, -68, -68, -68, -68, -68 + }, + + { + 9, -69, -69, -69, -69, -69, -69, -69, -69, -69, + -69, -69, -69, -69, -69, -69, -69, -69, -69, -69, + -69, -69, -69, -69, -69, -69, -69, -69, -69, -69, + -69, -69, -69, -69, -69, -69, -69, -69, -69 + + }, + + { + 9, -70, -70, -70, -70, -70, -70, -70, -70, -70, + -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, + -70, -70, -70, -70, -70, -70, -70, -70, -70, -70, + -70, -70, -70, -70, -70, -70, -70, -70, -70 + }, + + { + 9, -71, -71, -71, -71, -71, -71, -71, -71, -71, + -71, -71, -71, -71, -71, -71, -71, -71, -71, -71, + -71, -71, -71, -71, -71, -71, -71, -71, -71, -71, + -71, -71, -71, -71, -71, -71, -71, -71, -71 + }, + + { + 9, -72, -72, -72, -72, -72, -72, -72, -72, -72, + -72, -72, -72, -72, -72, -72, -72, -72, -72, -72, + + -72, -72, -72, -72, -72, -72, -72, -72, -72, -72, + -72, -72, -72, -72, -72, -72, -72, -72, -72 + }, + + { + 9, -73, -73, -73, -73, -73, -73, -73, -73, -73, + -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, + -73, -73, -73, -73, -73, -73, -73, -73, -73, -73, + -73, -73, -73, -73, -73, -73, -73, -73, -73 + }, + + { + 9, -74, -74, -74, -74, -74, -74, -74, -74, -74, + -74, -74, -74, -74, -74, -74, -74, -74, -74, -74, + -74, -74, -74, -74, -74, -74, -74, -74, -74, -74, + -74, -74, -74, -74, -74, -74, -74, -74, -74 + + }, + + { + 9, -75, -75, -75, -75, -75, -75, -75, -75, -75, + -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, + -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, + -75, -75, -75, -75, -75, -75, -75, -75, -75 + }, + + { + 9, 76, 76, -76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76 + }, + + { + 9, -77, 83, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -78, -78, -78, -78, -78, -78, -78, -78, -78, + -78, -78, -78, -78, -78, -78, -78, -78, -78, -78, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 84, 49, 49, 49, 49, 49 + }, + + { + 9, -79, -79, -79, -79, -79, -79, -79, -79, -79, + -79, -79, -79, -79, -79, -79, -79, -79, -79, -79, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 85, 49, 49, 49, 49, 49 + + }, + + { + 9, -80, -80, -80, -80, -80, -80, -80, -80, -80, + -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 86, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -81, -81, -81, -81, -81, -81, -81, -81, -81, + -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, + 49, 49, 49, 49, 87, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -82, 88, -82, -82, -82, -82, -82, -82, -82, + -82, -82, -82, -82, -82, -82, -82, -82, -82, -82, + + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -83, 83, -83, -83, -83, -83, -83, -83, -83, + -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, + -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, + -83, -83, -83, -83, -83, -83, -83, -83, -83 + }, + + { + 9, -84, 89, -84, -84, -84, -84, -84, -84, -84, + -84, -84, -84, -84, -84, -84, -84, -84, -84, -84, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + + }, + + { + 9, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 90, 49 + }, + + { + 9, -86, -86, -86, -86, -86, -86, -86, -86, -86, + -86, -86, -86, -86, -86, -86, -86, -86, -86, -86, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 91, 49, 49, 49, 49 + }, + + { + 9, -87, -87, -87, -87, -87, -87, -87, -87, -87, + -87, -87, -87, -87, -87, -87, -87, -87, -87, -87, + + 49, 49, 49, 49, 49, 49, 49, 49, 49, 92, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -88, 88, -88, -88, -88, -88, -88, -88, -88, + -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, + -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, + -88, -88, -88, -88, -88, -88, -88, -88, -88 + }, + + { + 9, -89, 89, -89, -89, -89, -89, -89, -89, -89, + -89, -89, -89, -89, -89, -89, -89, -89, -89, -89, + -89, -89, -89, -89, -89, -89, -89, -89, -89, -89, + -89, -89, -89, -89, -89, -89, -89, -89, -89 + + }, + + { + 9, -90, -90, -90, -90, -90, -90, -90, -90, -90, + -90, -90, -90, -90, -90, -90, -90, -90, -90, -90, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 93, 49, 49 + }, + + { + 9, -91, -91, -91, -91, -91, -91, -91, -91, -91, + -91, -91, -91, -91, -91, -91, -91, -91, -91, -91, + 49, 49, 49, 49, 94, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -92, 95, -92, -92, -92, -92, -92, -92, -92, + -92, -92, -92, -92, -92, -92, -92, -92, -92, -92, + + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -93, -93, -93, -93, -93, -93, -93, -93, -93, + -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, + 49, 49, 49, 49, 96, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -94, 97, -94, -94, -94, -94, -94, -94, -94, + -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + + }, + + { + 9, -95, 95, -95, -95, -95, -95, -95, -95, -95, + -95, -95, -95, -95, -95, -95, -95, -95, -95, -95, + -95, -95, -95, -95, -95, -95, -95, -95, -95, -95, + -95, -95, -95, -95, -95, -95, -95, -95, -95 + }, + + { + 9, -96, 98, -96, -96, -96, -96, -96, -96, -96, + -96, -96, -96, -96, -96, -96, -96, -96, -96, -96, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49 + }, + + { + 9, -97, 97, -97, -97, -97, -97, -97, -97, -97, + -97, -97, -97, -97, -97, -97, -97, -97, -97, -97, + + -97, -97, -97, -97, -97, -97, -97, -97, -97, -97, + -97, -97, -97, -97, -97, -97, -97, -97, -97 + }, + + { + 9, -98, 98, -98, -98, -98, -98, -98, -98, -98, + -98, -98, -98, -98, -98, -98, -98, -98, -98, -98, + -98, -98, -98, -98, -98, -98, -98, -98, -98, -98, + -98, -98, -98, -98, -98, -98, -98, -98, -98 + }, + + } ; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up sensors_yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + sensors_yyleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 50 +#define YY_END_OF_BUFFER 51 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[99] = + { 0, + 0, 0, 0, 0, 0, 0, 13, 13, 51, 12, + 1, 2, 3, 11, 11, 11, 11, 11, 11, 33, + 15, 16, 31, 18, 25, 26, 23, 21, 27, 22, + 33, 24, 20, 28, 32, 33, 29, 30, 49, 36, + 39, 48, 13, 14, 1, 2, 3, 4, 11, 11, + 11, 11, 11, 11, 11, 15, 18, 19, 20, 34, + 20, 32, 35, 17, 49, 38, 47, 37, 40, 41, + 42, 43, 44, 45, 46, 13, 8, 11, 11, 11, + 11, 6, 8, 9, 11, 11, 11, 6, 9, 11, + 11, 5, 11, 10, 5, 7, 10, 7 + + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 4, 5, 1, 1, 1, 1, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 1, 1, 1, + 1, 1, 1, 15, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 1, 17, 1, 18, 16, 19, 20, 21, 22, 23, + + 24, 25, 26, 27, 28, 23, 23, 29, 30, 31, + 32, 33, 23, 34, 35, 36, 37, 38, 23, 23, + 23, 23, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +extern int sensors_yy_flex_debug; +int sensors_yy_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *sensors_yytext; +#line 1 "lib/conf-lex.l" +#line 2 "lib/conf-lex.l" +/* + conf-lex.l - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#include +#include + +#include "general.h" +#include "data.h" +#include "conf-parse.h" +#include "error.h" +#include "scanner.h" + +static int buffer_count; +static int buffer_max; +static char *buffer; + +char sensors_lex_error[100]; + +const char *sensors_yyfilename; +int sensors_yylineno; + +#define buffer_malloc() sensors_malloc_array(&buffer,&buffer_count,\ + &buffer_max,1) +#define buffer_free() sensors_free_array(&buffer,&buffer_count,\ + &buffer_max) +#define buffer_add_char(c) sensors_add_array_el(c,&buffer,\ + &buffer_count,\ + &buffer_max,1) +#define buffer_add_string(s) sensors_add_array_els(s,strlen(s),\ + &buffer, \ + &buffer_count,&buffer_max,1) + +/* Scanner for configuration files */ +/* All states are exclusive */ + + + +/* Any whitespace-like character */ +/* Note: `10', `10.4' and `.4' are valid, `10.' is not */ +/* Only positive whole numbers are recognized here */ +#line 1255 "" + +#define INITIAL 0 +#define MIDDLE 1 +#define STRING 2 +#define ERR 3 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int sensors_yylex_destroy (void ); + +int sensors_yyget_debug (void ); + +void sensors_yyset_debug (int debug_flag ); + +YY_EXTRA_TYPE sensors_yyget_extra (void ); + +void sensors_yyset_extra (YY_EXTRA_TYPE user_defined ); + +FILE *sensors_yyget_in (void ); + +void sensors_yyset_in (FILE * in_str ); + +FILE *sensors_yyget_out (void ); + +void sensors_yyset_out (FILE * out_str ); + +int sensors_yyget_leng (void ); + +char *sensors_yyget_text (void ); + +int sensors_yyget_lineno (void ); + +void sensors_yyset_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int sensors_yywrap (void ); +#else +extern int sensors_yywrap (void ); +#endif +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( sensors_yytext, sensors_yyleng, 1, sensors_yyout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( sensors_yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( sensors_yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, sensors_yyin))==0 && ferror(sensors_yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(sensors_yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int sensors_yylex (void); + +#define YY_DECL int sensors_yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after sensors_yytext and sensors_yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 80 "lib/conf-lex.l" + + + /* + * STATE: INITIAL + */ + +#line 1450 "" + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! sensors_yyin ) + sensors_yyin = stdin; + + if ( ! sensors_yyout ) + sensors_yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + sensors_yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + sensors_yy_create_buffer(sensors_yyin,YY_BUF_SIZE ); + } + + sensors_yy_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of sensors_yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 ) + ++yy_cp; + + yy_current_state = -yy_current_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + +case YY_STATE_EOF(INITIAL): +#line 88 "lib/conf-lex.l" +{ /* EOF from this state terminates */ + return 0; + } + YY_BREAK +case 1: +YY_RULE_SETUP +#line 92 "lib/conf-lex.l" +; /* eat as many blanks as possible at once */ + YY_BREAK +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +#line 94 "lib/conf-lex.l" +{ /* eat a bare newline (possibly preceded by blanks) */ + sensors_yylineno++; + } + YY_BREAK +/* comments */ +case 3: +YY_RULE_SETUP +#line 100 "lib/conf-lex.l" +; /* eat the rest of the line after comment char */ + YY_BREAK +case 4: +/* rule 4 can match eol */ +YY_RULE_SETUP +#line 102 "lib/conf-lex.l" +{ /* eat the rest of the line after comment char */ + sensors_yylineno++; + } + YY_BREAK +/* + * Keywords must be followed by whitespace - eat that too. + * If there isn't trailing whitespace, we still need to + * accept it as lexically correct (even though the parser + * will reject it anyway.) + */ +case 5: +YY_RULE_SETUP +#line 113 "lib/conf-lex.l" +{ + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return LABEL; + } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 120 "lib/conf-lex.l" +{ + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return SET; + } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 127 "lib/conf-lex.l" +{ + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return COMPUTE; + } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 134 "lib/conf-lex.l" +{ + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return BUS; + } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 141 "lib/conf-lex.l" +{ + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return CHIP; + } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 148 "lib/conf-lex.l" +{ + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return IGNORE; + } + YY_BREAK +/* Anything else at the beginning of a line is an error */ +case 11: +#line 158 "lib/conf-lex.l" +case 12: +YY_RULE_SETUP +#line 158 "lib/conf-lex.l" +{ + BEGIN(ERR); + strcpy(sensors_lex_error,"Invalid keyword"); + return ERROR; + } + YY_BREAK + +/* + * STATE: ERROR + */ + +case 13: +YY_RULE_SETUP +#line 171 "lib/conf-lex.l" +; /* eat whatever is left on this line */ + YY_BREAK +case 14: +/* rule 14 can match eol */ +YY_RULE_SETUP +#line 173 "lib/conf-lex.l" +{ + BEGIN(INITIAL); + sensors_yylineno++; + return EOL; + } + YY_BREAK + +/* + * STATE: MIDDLE + */ + +case 15: +YY_RULE_SETUP +#line 186 "lib/conf-lex.l" +; /* eat as many blanks as possible at once */ + YY_BREAK +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +#line 188 "lib/conf-lex.l" +{ /* newline here sends EOL token to parser */ + BEGIN(INITIAL); + sensors_yylineno++; + return EOL; + } + YY_BREAK +case YY_STATE_EOF(MIDDLE): +#line 194 "lib/conf-lex.l" +{ /* EOF here sends EOL token to parser also */ + BEGIN(INITIAL); + return EOL; + } + YY_BREAK +case 17: +/* rule 17 can match eol */ +YY_RULE_SETUP +#line 199 "lib/conf-lex.l" +{ /* eat an escaped newline with no state change */ + sensors_yylineno++; + } + YY_BREAK +/* comments */ +case 18: +YY_RULE_SETUP +#line 205 "lib/conf-lex.l" +; /* eat the rest of the line after comment char */ + YY_BREAK +case 19: +/* rule 19 can match eol */ +YY_RULE_SETUP +#line 207 "lib/conf-lex.l" +{ /* eat the rest of the line after comment char */ + BEGIN(INITIAL); + sensors_yylineno++; + return EOL; + } + YY_BREAK +/* A number */ +case 20: +YY_RULE_SETUP +#line 215 "lib/conf-lex.l" +{ + sensors_yylval.value = atof(sensors_yytext); + return FLOAT; + } + YY_BREAK +/* Some operators */ +case 21: +YY_RULE_SETUP +#line 222 "lib/conf-lex.l" +return '+'; + YY_BREAK +case 22: +YY_RULE_SETUP +#line 223 "lib/conf-lex.l" +return '-'; + YY_BREAK +case 23: +YY_RULE_SETUP +#line 224 "lib/conf-lex.l" +return '*'; + YY_BREAK +case 24: +YY_RULE_SETUP +#line 225 "lib/conf-lex.l" +return '/'; + YY_BREAK +case 25: +YY_RULE_SETUP +#line 226 "lib/conf-lex.l" +return '('; + YY_BREAK +case 26: +YY_RULE_SETUP +#line 227 "lib/conf-lex.l" +return ')'; + YY_BREAK +case 27: +YY_RULE_SETUP +#line 228 "lib/conf-lex.l" +return ','; + YY_BREAK +case 28: +YY_RULE_SETUP +#line 229 "lib/conf-lex.l" +return '@'; + YY_BREAK +case 29: +YY_RULE_SETUP +#line 230 "lib/conf-lex.l" +return '^'; + YY_BREAK +case 30: +YY_RULE_SETUP +#line 231 "lib/conf-lex.l" +return '`'; + YY_BREAK +/* Quoted string */ +case 31: +YY_RULE_SETUP +#line 235 "lib/conf-lex.l" +{ + buffer_malloc(); + BEGIN(STRING); + } + YY_BREAK +/* A normal, unquoted identifier */ +case 32: +YY_RULE_SETUP +#line 242 "lib/conf-lex.l" +{ + sensors_yylval.name = strdup(sensors_yytext); + if (! sensors_yylval.name) + sensors_fatal_error("conf-lex.l", + "Allocating a new string"); + + return NAME; + } + YY_BREAK +/* anything else is bogus */ +case 33: +#line 254 "lib/conf-lex.l" +case 34: +#line 255 "lib/conf-lex.l" +case 35: +YY_RULE_SETUP +#line 255 "lib/conf-lex.l" +{ + BEGIN(ERR); + return ERROR; + } + YY_BREAK + +/* + * STATE: STRING + */ + +/* Oops, newline or EOF while in a string is not good */ +case 36: +/* rule 36 can match eol */ +#line 270 "lib/conf-lex.l" +case 37: +/* rule 37 can match eol */ +YY_RULE_SETUP +#line 270 "lib/conf-lex.l" +{ + buffer_add_char("\0"); + strcpy(sensors_lex_error, + "No matching double quote."); + buffer_free(); + yyless(0); + BEGIN(ERR); + return ERROR; + } + YY_BREAK +case YY_STATE_EOF(STRING): +#line 280 "lib/conf-lex.l" +{ + strcpy(sensors_lex_error, + "Reached end-of-file without a matching double quote."); + buffer_free(); + BEGIN(MIDDLE); + return ERROR; + } + YY_BREAK +/* At the end */ +case 38: +YY_RULE_SETUP +#line 290 "lib/conf-lex.l" +{ + buffer_add_char("\0"); + strcpy(sensors_lex_error, + "Quoted strings must be separated by whitespace."); + buffer_free(); + BEGIN(ERR); + return ERROR; + } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 299 "lib/conf-lex.l" +{ + buffer_add_char("\0"); + sensors_yylval.name = strdup(buffer); + if (! sensors_yylval.name) + sensors_fatal_error("conf-lex.l", + "Allocating a new string"); + buffer_free(); + BEGIN(MIDDLE); + return NAME; + } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 310 "lib/conf-lex.l" +buffer_add_char("\a"); + YY_BREAK +case 41: +YY_RULE_SETUP +#line 311 "lib/conf-lex.l" +buffer_add_char("\b"); + YY_BREAK +case 42: +YY_RULE_SETUP +#line 312 "lib/conf-lex.l" +buffer_add_char("\f"); + YY_BREAK +case 43: +YY_RULE_SETUP +#line 313 "lib/conf-lex.l" +buffer_add_char("\n"); + YY_BREAK +case 44: +YY_RULE_SETUP +#line 314 "lib/conf-lex.l" +buffer_add_char("\r"); + YY_BREAK +case 45: +YY_RULE_SETUP +#line 315 "lib/conf-lex.l" +buffer_add_char("\t"); + YY_BREAK +case 46: +YY_RULE_SETUP +#line 316 "lib/conf-lex.l" +buffer_add_char("\v"); + YY_BREAK +/* Other escapes: just copy the character behind the slash */ +case 47: +YY_RULE_SETUP +#line 320 "lib/conf-lex.l" +{ + buffer_add_char(&sensors_yytext[1]); + } + YY_BREAK +/* Anything else (including a bare '\' which may be followed by EOF) */ +case 48: +#line 327 "lib/conf-lex.l" +case 49: +YY_RULE_SETUP +#line 327 "lib/conf-lex.l" +{ + buffer_add_string(sensors_yytext); + } + YY_BREAK + +case 50: +YY_RULE_SETUP +#line 332 "lib/conf-lex.l" +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK +#line 1903 "" + case YY_STATE_EOF(ERR): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed sensors_yyin at a new source and called + * sensors_yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = sensors_yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( sensors_yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * sensors_yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of sensors_yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + sensors_yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), (size_t) num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + sensors_yyrestart(sensors_yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) sensors_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + + yy_current_state = yy_nxt[yy_current_state][1]; + yy_is_jam = (yy_current_state <= 0); + + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + sensors_yyrestart(sensors_yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( sensors_yywrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve sensors_yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void sensors_yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + sensors_yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + sensors_yy_create_buffer(sensors_yyin,YY_BUF_SIZE ); + } + + sensors_yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + sensors_yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void sensors_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * sensors_yypop_buffer_state(); + * sensors_yypush_buffer_state(new_buffer); + */ + sensors_yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + sensors_yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (sensors_yywrap()) processing, but the only time this flag + * is looked at is after sensors_yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void sensors_yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + sensors_yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE sensors_yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) sensors_yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in sensors_yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) sensors_yyalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in sensors_yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + sensors_yy_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with sensors_yy_create_buffer() + * + */ + void sensors_yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + sensors_yyfree((void *) b->yy_ch_buf ); + + sensors_yyfree((void *) b ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a sensors_yyrestart() or at EOF. + */ + static void sensors_yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + sensors_yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then sensors_yy_init_buffer was _probably_ + * called from sensors_yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void sensors_yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + sensors_yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void sensors_yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + sensors_yyensure_buffer_stack(); + + /* This block is copied from sensors_yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from sensors_yy_switch_to_buffer. */ + sensors_yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void sensors_yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + sensors_yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + sensors_yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void sensors_yyensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)sensors_yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in sensors_yyensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)sensors_yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in sensors_yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE sensors_yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) sensors_yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in sensors_yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + sensors_yy_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to sensors_yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * sensors_yy_scan_bytes() instead. + */ +YY_BUFFER_STATE sensors_yy_scan_string (yyconst char * yystr ) +{ + + return sensors_yy_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to sensors_yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE sensors_yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) sensors_yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in sensors_yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = sensors_yy_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in sensors_yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up sensors_yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + sensors_yytext[sensors_yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = sensors_yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + sensors_yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int sensors_yyget_lineno (void) +{ + + return sensors_yylineno; +} + +/** Get the input stream. + * + */ +FILE *sensors_yyget_in (void) +{ + return sensors_yyin; +} + +/** Get the output stream. + * + */ +FILE *sensors_yyget_out (void) +{ + return sensors_yyout; +} + +/** Get the length of the current token. + * + */ +int sensors_yyget_leng (void) +{ + return sensors_yyleng; +} + +/** Get the current token. + * + */ + +char *sensors_yyget_text (void) +{ + return sensors_yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void sensors_yyset_lineno (int line_number ) +{ + + sensors_yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see sensors_yy_switch_to_buffer + */ +void sensors_yyset_in (FILE * in_str ) +{ + sensors_yyin = in_str ; +} + +void sensors_yyset_out (FILE * out_str ) +{ + sensors_yyout = out_str ; +} + +int sensors_yyget_debug (void) +{ + return sensors_yy_flex_debug; +} + +void sensors_yyset_debug (int bdebug ) +{ + sensors_yy_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from sensors_yylex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + sensors_yyin = stdin; + sensors_yyout = stdout; +#else + sensors_yyin = (FILE *) 0; + sensors_yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * sensors_yylex_init() + */ + return 0; +} + +/* sensors_yylex_destroy is for both reentrant and non-reentrant scanners. */ +int sensors_yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + sensors_yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + sensors_yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + sensors_yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * sensors_yylex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *sensors_yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *sensors_yyrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void sensors_yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see sensors_yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 332 "lib/conf-lex.l" + + + +/* + Do the buffer handling manually. This allows us to scan as many + config files as we need to, while cleaning up properly after each + one. The "BEGIN(0)" line ensures that we start in the default state, + even if e.g. the previous config file was syntactically broken. + + Returns 0 if successful, !0 otherwise. +*/ + +static YY_BUFFER_STATE scan_buf = (YY_BUFFER_STATE)0; + +int sensors_scanner_init(FILE *input, const char *filename) +{ + BEGIN(0); + if (!(scan_buf = sensors_yy_create_buffer(input, YY_BUF_SIZE))) + return -1; + + sensors_yy_switch_to_buffer(scan_buf); + sensors_yyfilename = filename; + sensors_yylineno = 1; + return 0; +} + +void sensors_scanner_exit(void) +{ + sensors_yy_delete_buffer(scan_buf); + scan_buf = (YY_BUFFER_STATE)0; + +/* As of flex 2.5.9, sensors_yylex_destroy() must be called when done with the + scaller, otherwise we'll leak memory. */ +#if defined(YY_FLEX_MAJOR_VERSION) && defined(YY_FLEX_MINOR_VERSION) && defined(YY_FLEX_SUBMINOR_VERSION) +#if YY_FLEX_MAJOR_VERSION > 2 || \ + (YY_FLEX_MAJOR_VERSION == 2 && (YY_FLEX_MINOR_VERSION > 5 || \ + (YY_FLEX_MINOR_VERSION == 5 && YY_FLEX_SUBMINOR_VERSION >= 9))) + sensors_yylex_destroy(); +#endif +#endif +} + + diff --git a/tools/gator/daemon/libsensors/conf-lex.l b/tools/gator/daemon/libsensors/conf-lex.l new file mode 100644 index 00000000..43ddbd8f --- /dev/null +++ b/tools/gator/daemon/libsensors/conf-lex.l @@ -0,0 +1,372 @@ +%{ +/* + conf-lex.l - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#include +#include + +#include "general.h" +#include "data.h" +#include "conf-parse.h" +#include "error.h" +#include "scanner.h" + +static int buffer_count; +static int buffer_max; +static char *buffer; + +char sensors_lex_error[100]; + +const char *sensors_yyfilename; +int sensors_yylineno; + +#define buffer_malloc() sensors_malloc_array(&buffer,&buffer_count,\ + &buffer_max,1) +#define buffer_free() sensors_free_array(&buffer,&buffer_count,\ + &buffer_max) +#define buffer_add_char(c) sensors_add_array_el(c,&buffer,\ + &buffer_count,\ + &buffer_max,1) +#define buffer_add_string(s) sensors_add_array_els(s,strlen(s),\ + &buffer, \ + &buffer_count,&buffer_max,1) + +%} + + /* Scanner for configuration files */ + +%option nodefault +%option noyywrap +%option nounput + + /* All states are exclusive */ + +%x MIDDLE +%x STRING +%x ERR + + /* Any whitespace-like character */ + +BLANK [ \f\r\t\v] + +IDCHAR [[:alnum:]_] + + /* Note: `10', `10.4' and `.4' are valid, `10.' is not */ + +FLOAT [[:digit:]]*\.?[[:digit:]]+ + + /* Only positive whole numbers are recognized here */ + +NUM 0|([1-9][[:digit:]]*) + + +%% + + /* + * STATE: INITIAL + */ + +{ + +<> { /* EOF from this state terminates */ + return 0; + } + +{BLANK}+ ; /* eat as many blanks as possible at once */ + +{BLANK}*\n { /* eat a bare newline (possibly preceded by blanks) */ + sensors_yylineno++; + } + + /* comments */ + +#.* ; /* eat the rest of the line after comment char */ + +#.*\n { /* eat the rest of the line after comment char */ + sensors_yylineno++; + } + + /* + * Keywords must be followed by whitespace - eat that too. + * If there isn't trailing whitespace, we still need to + * accept it as lexically correct (even though the parser + * will reject it anyway.) + */ + +label{BLANK}* { + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return LABEL; + } + +set{BLANK}* { + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return SET; + } + +compute{BLANK}* { + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return COMPUTE; + } + +bus{BLANK}* { + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return BUS; + } + +chip{BLANK}* { + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return CHIP; + } + +ignore{BLANK}* { + sensors_yylval.line.filename = sensors_yyfilename; + sensors_yylval.line.lineno = sensors_yylineno; + BEGIN(MIDDLE); + return IGNORE; + } + + /* Anything else at the beginning of a line is an error */ + +[a-z]+ | +. { + BEGIN(ERR); + strcpy(sensors_lex_error,"Invalid keyword"); + return ERROR; + } +} + + /* + * STATE: ERROR + */ + +{ + +.* ; /* eat whatever is left on this line */ + +\n { + BEGIN(INITIAL); + sensors_yylineno++; + return EOL; + } +} + + /* + * STATE: MIDDLE + */ + +{ + +{BLANK}+ ; /* eat as many blanks as possible at once */ + +\n { /* newline here sends EOL token to parser */ + BEGIN(INITIAL); + sensors_yylineno++; + return EOL; + } + +<> { /* EOF here sends EOL token to parser also */ + BEGIN(INITIAL); + return EOL; + } + +\\{BLANK}*\n { /* eat an escaped newline with no state change */ + sensors_yylineno++; + } + + /* comments */ + +#.* ; /* eat the rest of the line after comment char */ + +#.*\n { /* eat the rest of the line after comment char */ + BEGIN(INITIAL); + sensors_yylineno++; + return EOL; + } + + /* A number */ + +{FLOAT} { + sensors_yylval.value = atof(sensors_yytext); + return FLOAT; + } + + /* Some operators */ + +"+" return '+'; +"-" return '-'; +"*" return '*'; +"/" return '/'; +"(" return '('; +")" return ')'; +"," return ','; +"@" return '@'; +"^" return '^'; +"`" return '`'; + + /* Quoted string */ + +\" { + buffer_malloc(); + BEGIN(STRING); + } + + /* A normal, unquoted identifier */ + +{IDCHAR}+ { + sensors_yylval.name = strdup(sensors_yytext); + if (! sensors_yylval.name) + sensors_fatal_error("conf-lex.l", + "Allocating a new string"); + + return NAME; + } + + /* anything else is bogus */ + +. | +[[:digit:]]*\. | +\\{BLANK}* { + BEGIN(ERR); + return ERROR; + } +} + + /* + * STATE: STRING + */ + +{ + + /* Oops, newline or EOF while in a string is not good */ + +\n | +\\\n { + buffer_add_char("\0"); + strcpy(sensors_lex_error, + "No matching double quote."); + buffer_free(); + yyless(0); + BEGIN(ERR); + return ERROR; + } + +<> { + strcpy(sensors_lex_error, + "Reached end-of-file without a matching double quote."); + buffer_free(); + BEGIN(MIDDLE); + return ERROR; + } + + /* At the end */ + +\"\" { + buffer_add_char("\0"); + strcpy(sensors_lex_error, + "Quoted strings must be separated by whitespace."); + buffer_free(); + BEGIN(ERR); + return ERROR; + } + +\" { + buffer_add_char("\0"); + sensors_yylval.name = strdup(buffer); + if (! sensors_yylval.name) + sensors_fatal_error("conf-lex.l", + "Allocating a new string"); + buffer_free(); + BEGIN(MIDDLE); + return NAME; + } + +\\a buffer_add_char("\a"); +\\b buffer_add_char("\b"); +\\f buffer_add_char("\f"); +\\n buffer_add_char("\n"); +\\r buffer_add_char("\r"); +\\t buffer_add_char("\t"); +\\v buffer_add_char("\v"); + + /* Other escapes: just copy the character behind the slash */ + +\\. { + buffer_add_char(&sensors_yytext[1]); + } + + /* Anything else (including a bare '\' which may be followed by EOF) */ + +\\ | +[^\\\n\"]+ { + buffer_add_string(sensors_yytext); + } +} + +%% + +/* + Do the buffer handling manually. This allows us to scan as many + config files as we need to, while cleaning up properly after each + one. The "BEGIN(0)" line ensures that we start in the default state, + even if e.g. the previous config file was syntactically broken. + + Returns 0 if successful, !0 otherwise. +*/ + +static YY_BUFFER_STATE scan_buf = (YY_BUFFER_STATE)0; + +int sensors_scanner_init(FILE *input, const char *filename) +{ + BEGIN(0); + if (!(scan_buf = sensors_yy_create_buffer(input, YY_BUF_SIZE))) + return -1; + + sensors_yy_switch_to_buffer(scan_buf); + sensors_yyfilename = filename; + sensors_yylineno = 1; + return 0; +} + +void sensors_scanner_exit(void) +{ + sensors_yy_delete_buffer(scan_buf); + scan_buf = (YY_BUFFER_STATE)0; + +/* As of flex 2.5.9, yylex_destroy() must be called when done with the + scaller, otherwise we'll leak memory. */ +#if defined(YY_FLEX_MAJOR_VERSION) && defined(YY_FLEX_MINOR_VERSION) && defined(YY_FLEX_SUBMINOR_VERSION) +#if YY_FLEX_MAJOR_VERSION > 2 || \ + (YY_FLEX_MAJOR_VERSION == 2 && (YY_FLEX_MINOR_VERSION > 5 || \ + (YY_FLEX_MINOR_VERSION == 5 && YY_FLEX_SUBMINOR_VERSION >= 9))) + sensors_yylex_destroy(); +#endif +#endif +} + diff --git a/tools/gator/daemon/libsensors/conf-parse.c b/tools/gator/daemon/libsensors/conf-parse.c new file mode 100644 index 00000000..fb775460 --- /dev/null +++ b/tools/gator/daemon/libsensors/conf-parse.c @@ -0,0 +1,2042 @@ +/* A Bison parser, made by GNU Bison 2.5. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.5" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* Substitute the variable and function names. */ +#define yyparse sensors_yyparse +#define yylex sensors_yylex +#define yyerror sensors_yyerror +#define yylval sensors_yylval +#define yychar sensors_yychar +#define yydebug sensors_yydebug +#define yynerrs sensors_yynerrs + + +/* Copy the first part of user declarations. */ + +/* Line 268 of yacc.c */ +#line 1 "lib/conf-parse.y" + +/* + conf-parse.y - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#define YYERROR_VERBOSE + +#include +#include +#include + +#include "data.h" +#include "general.h" +#include "error.h" +#include "conf.h" +#include "access.h" +#include "init.h" + +static void sensors_yyerror(const char *err); +static sensors_expr *malloc_expr(void); + +static sensors_chip *current_chip = NULL; + +#define bus_add_el(el) sensors_add_array_el(el,\ + &sensors_config_busses,\ + &sensors_config_busses_count,\ + &sensors_config_busses_max,\ + sizeof(sensors_bus)) +#define label_add_el(el) sensors_add_array_el(el,\ + ¤t_chip->labels,\ + ¤t_chip->labels_count,\ + ¤t_chip->labels_max,\ + sizeof(sensors_label)); +#define set_add_el(el) sensors_add_array_el(el,\ + ¤t_chip->sets,\ + ¤t_chip->sets_count,\ + ¤t_chip->sets_max,\ + sizeof(sensors_set)); +#define compute_add_el(el) sensors_add_array_el(el,\ + ¤t_chip->computes,\ + ¤t_chip->computes_count,\ + ¤t_chip->computes_max,\ + sizeof(sensors_compute)); +#define ignore_add_el(el) sensors_add_array_el(el,\ + ¤t_chip->ignores,\ + ¤t_chip->ignores_count,\ + ¤t_chip->ignores_max,\ + sizeof(sensors_ignore)); +#define chip_add_el(el) sensors_add_array_el(el,\ + &sensors_config_chips,\ + &sensors_config_chips_count,\ + &sensors_config_chips_max,\ + sizeof(sensors_chip)); + +#define fits_add_el(el,list) sensors_add_array_el(el,\ + &(list).fits,\ + &(list).fits_count,\ + &(list).fits_max, \ + sizeof(sensors_chip_name)); + + + +/* Line 268 of yacc.c */ +#line 158 "lib/conf-parse.c" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + NEG = 258, + EOL = 259, + BUS = 260, + LABEL = 261, + SET = 262, + CHIP = 263, + COMPUTE = 264, + IGNORE = 265, + FLOAT = 266, + NAME = 267, + ERROR = 268 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 293 of yacc.c */ +#line 79 "lib/conf-parse.y" + + double value; + char *name; + void *nothing; + sensors_chip_name_list chips; + sensors_expr *expr; + sensors_bus_id bus; + sensors_chip_name chip; + sensors_config_line line; + + + +/* Line 293 of yacc.c */ +#line 220 "lib/conf-parse.c" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 343 of yacc.c */ +#line 232 "lib/conf-parse.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 2 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 58 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 24 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 16 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 34 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 63 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 268 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 22, 23, 5, 4, 10, 3, 2, 6, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 21, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 8, 2, 9, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 7, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint8 yyprhs[] = +{ + 0, 0, 3, 4, 7, 10, 13, 16, 19, 22, + 25, 28, 32, 36, 40, 46, 49, 52, 54, 57, + 59, 61, 63, 67, 71, 75, 79, 82, 86, 89, + 92, 94, 96, 98, 100 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 25, 0, -1, -1, 25, 26, -1, 27, 11, -1, + 28, 11, -1, 29, 11, -1, 32, 11, -1, 30, + 11, -1, 31, 11, -1, 1, 11, -1, 12, 35, + 36, -1, 13, 37, 38, -1, 14, 37, 34, -1, + 16, 37, 34, 10, 34, -1, 17, 37, -1, 15, + 33, -1, 39, -1, 33, 39, -1, 18, -1, 19, + -1, 21, -1, 34, 4, 34, -1, 34, 3, 34, + -1, 34, 5, 34, -1, 34, 6, 34, -1, 3, + 34, -1, 22, 34, 23, -1, 8, 34, -1, 9, + 34, -1, 19, -1, 19, -1, 19, -1, 19, -1, + 19, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 119, 119, 120, 123, 124, 125, 126, 127, 128, + 129, 132, 141, 156, 171, 188, 201, 219, 225, 231, + 236, 241, 245, 252, 259, 266, 273, 280, 282, 289, + 298, 308, 312, 316, 320 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "'-'", "'+'", "'*'", "'/'", "NEG", "'^'", + "'`'", "','", "EOL", "BUS", "LABEL", "SET", "CHIP", "COMPUTE", "IGNORE", + "FLOAT", "NAME", "ERROR", "'@'", "'('", "')'", "$accept", "input", + "line", "bus_statement", "label_statement", "set_statement", + "compute_statement", "ignore_statement", "chip_statement", + "chip_name_list", "expression", "bus_id", "adapter_name", + "function_name", "string", "chip_name", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 45, 43, 42, 47, 258, 94, 96, + 44, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 64, 40, 41 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 24, 25, 25, 26, 26, 26, 26, 26, 26, + 26, 27, 28, 29, 30, 31, 32, 33, 33, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 36, 37, 38, 39 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 3, 3, 5, 2, 2, 1, 2, 1, + 1, 1, 3, 3, 3, 3, 2, 3, 2, 2, + 1, 1, 1, 1, 1 +}; + +/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 10, 30, 0, + 32, 0, 0, 34, 16, 17, 0, 15, 4, 5, + 6, 8, 9, 7, 31, 11, 33, 12, 0, 0, + 0, 19, 20, 21, 0, 13, 18, 0, 26, 28, + 29, 0, 0, 0, 0, 0, 0, 27, 23, 22, + 24, 25, 14 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 1, 10, 11, 12, 13, 14, 15, 16, 24, + 45, 19, 35, 21, 37, 25 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -27 +static const yytype_int8 yypact[] = +{ + -27, 37, -27, -4, -3, 1, 1, 6, 1, 1, + -27, 8, 13, 20, 23, 32, 34, -27, -27, 29, + -27, 39, 14, -27, 6, -27, 14, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, 14, 14, + 14, -27, -27, -27, 14, 36, -27, 5, -27, -27, + -27, -2, 14, 14, 14, 14, 14, -27, 0, 0, + -27, -27, 36 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -26, -27, -27, 38, -27, 31 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const yytype_uint8 yytable[] = +{ + 47, 52, 53, 54, 55, 54, 55, 17, 52, 53, + 54, 55, 48, 49, 50, 56, 18, 38, 51, 28, + 20, 57, 39, 40, 29, 23, 58, 59, 60, 61, + 62, 30, 41, 42, 31, 43, 44, 2, 3, 52, + 53, 54, 55, 32, 22, 33, 26, 27, 34, 4, + 5, 6, 7, 8, 9, 46, 0, 0, 36 +}; + +#define yypact_value_is_default(yystate) \ + ((yystate) == (-27)) + +#define yytable_value_is_error(yytable_value) \ + YYID (0) + +static const yytype_int8 yycheck[] = +{ + 26, 3, 4, 5, 6, 5, 6, 11, 3, 4, + 5, 6, 38, 39, 40, 10, 19, 3, 44, 11, + 19, 23, 8, 9, 11, 19, 52, 53, 54, 55, + 56, 11, 18, 19, 11, 21, 22, 0, 1, 3, + 4, 5, 6, 11, 6, 11, 8, 9, 19, 12, + 13, 14, 15, 16, 17, 24, -1, -1, 19 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 25, 0, 1, 12, 13, 14, 15, 16, 17, + 26, 27, 28, 29, 30, 31, 32, 11, 19, 35, + 19, 37, 37, 19, 33, 39, 37, 37, 11, 11, + 11, 11, 11, 11, 19, 36, 19, 38, 3, 8, + 9, 18, 19, 21, 22, 34, 39, 34, 34, 34, + 34, 34, 3, 4, 5, 6, 10, 23, 34, 34, + 34, 34, 34 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. However, + YYFAIL appears to be in use. Nevertheless, it is formally deprecated + in Bison 2.4.2's NEWS entry, where a plan to phase it out is + discussed. */ + +#define YYFAIL goto yyerrlab +#if defined YYFAIL + /* This is here to suppress warnings from the GCC cpp's + -Wunused-macros. Normally we don't worry about that warning, but + some users do, and we want to make it easy for users to remove + YYFAIL uses, which will produce warnings from Bison 2.5. */ +#endif + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* This macro is provided for backward compatibility. */ + +#ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP. + + Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return 2 if the + required number of bytes is too large to store. */ +static int +yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, + yytype_int16 *yyssp, int yytoken) +{ + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = 0; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 0; + + /* There are many possibilities here to consider: + - Assume YYFAIL is not used. It's too flawed to consider. See + + for details. YYERROR is fine as it does not invoke this + function. + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state. + */ + if (yytoken != YYEMPTY) + { + int yyn = yypact[*yyssp]; + yyarg[yycount++] = yytname[yytoken]; + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + } + } + + switch (yycount) + { +# define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +# undef YYCASE_ + } + + yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; + return 1; + } + + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + { + char *yyp = *yymsg; + int yyi = 0; + while ((*yyp = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + return 0; +} +#endif /* YYERROR_VERBOSE */ + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 11: + +/* Line 1806 of yacc.c */ +#line 133 "lib/conf-parse.y" + { sensors_bus new_el; + new_el.line = (yyvsp[(1) - (3)].line); + new_el.bus = (yyvsp[(2) - (3)].bus); + new_el.adapter = (yyvsp[(3) - (3)].name); + bus_add_el(&new_el); + } + break; + + case 12: + +/* Line 1806 of yacc.c */ +#line 142 "lib/conf-parse.y" + { sensors_label new_el; + if (!current_chip) { + sensors_yyerror("Label statement before first chip statement"); + free((yyvsp[(2) - (3)].name)); + free((yyvsp[(3) - (3)].name)); + YYERROR; + } + new_el.line = (yyvsp[(1) - (3)].line); + new_el.name = (yyvsp[(2) - (3)].name); + new_el.value = (yyvsp[(3) - (3)].name); + label_add_el(&new_el); + } + break; + + case 13: + +/* Line 1806 of yacc.c */ +#line 157 "lib/conf-parse.y" + { sensors_set new_el; + if (!current_chip) { + sensors_yyerror("Set statement before first chip statement"); + free((yyvsp[(2) - (3)].name)); + sensors_free_expr((yyvsp[(3) - (3)].expr)); + YYERROR; + } + new_el.line = (yyvsp[(1) - (3)].line); + new_el.name = (yyvsp[(2) - (3)].name); + new_el.value = (yyvsp[(3) - (3)].expr); + set_add_el(&new_el); + } + break; + + case 14: + +/* Line 1806 of yacc.c */ +#line 172 "lib/conf-parse.y" + { sensors_compute new_el; + if (!current_chip) { + sensors_yyerror("Compute statement before first chip statement"); + free((yyvsp[(2) - (5)].name)); + sensors_free_expr((yyvsp[(3) - (5)].expr)); + sensors_free_expr((yyvsp[(5) - (5)].expr)); + YYERROR; + } + new_el.line = (yyvsp[(1) - (5)].line); + new_el.name = (yyvsp[(2) - (5)].name); + new_el.from_proc = (yyvsp[(3) - (5)].expr); + new_el.to_proc = (yyvsp[(5) - (5)].expr); + compute_add_el(&new_el); + } + break; + + case 15: + +/* Line 1806 of yacc.c */ +#line 189 "lib/conf-parse.y" + { sensors_ignore new_el; + if (!current_chip) { + sensors_yyerror("Ignore statement before first chip statement"); + free((yyvsp[(2) - (2)].name)); + YYERROR; + } + new_el.line = (yyvsp[(1) - (2)].line); + new_el.name = (yyvsp[(2) - (2)].name); + ignore_add_el(&new_el); + } + break; + + case 16: + +/* Line 1806 of yacc.c */ +#line 202 "lib/conf-parse.y" + { sensors_chip new_el; + new_el.line = (yyvsp[(1) - (2)].line); + new_el.labels = NULL; + new_el.sets = NULL; + new_el.computes = NULL; + new_el.ignores = NULL; + new_el.labels_count = new_el.labels_max = 0; + new_el.sets_count = new_el.sets_max = 0; + new_el.computes_count = new_el.computes_max = 0; + new_el.ignores_count = new_el.ignores_max = 0; + new_el.chips = (yyvsp[(2) - (2)].chips); + chip_add_el(&new_el); + current_chip = sensors_config_chips + + sensors_config_chips_count - 1; + } + break; + + case 17: + +/* Line 1806 of yacc.c */ +#line 220 "lib/conf-parse.y" + { + (yyval.chips).fits = NULL; + (yyval.chips).fits_count = (yyval.chips).fits_max = 0; + fits_add_el(&(yyvsp[(1) - (1)].chip),(yyval.chips)); + } + break; + + case 18: + +/* Line 1806 of yacc.c */ +#line 226 "lib/conf-parse.y" + { (yyval.chips) = (yyvsp[(1) - (2)].chips); + fits_add_el(&(yyvsp[(2) - (2)].chip),(yyval.chips)); + } + break; + + case 19: + +/* Line 1806 of yacc.c */ +#line 232 "lib/conf-parse.y" + { (yyval.expr) = malloc_expr(); + (yyval.expr)->data.val = (yyvsp[(1) - (1)].value); + (yyval.expr)->kind = sensors_kind_val; + } + break; + + case 20: + +/* Line 1806 of yacc.c */ +#line 237 "lib/conf-parse.y" + { (yyval.expr) = malloc_expr(); + (yyval.expr)->data.var = (yyvsp[(1) - (1)].name); + (yyval.expr)->kind = sensors_kind_var; + } + break; + + case 21: + +/* Line 1806 of yacc.c */ +#line 242 "lib/conf-parse.y" + { (yyval.expr) = malloc_expr(); + (yyval.expr)->kind = sensors_kind_source; + } + break; + + case 22: + +/* Line 1806 of yacc.c */ +#line 246 "lib/conf-parse.y" + { (yyval.expr) = malloc_expr(); + (yyval.expr)->kind = sensors_kind_sub; + (yyval.expr)->data.subexpr.op = sensors_add; + (yyval.expr)->data.subexpr.sub1 = (yyvsp[(1) - (3)].expr); + (yyval.expr)->data.subexpr.sub2 = (yyvsp[(3) - (3)].expr); + } + break; + + case 23: + +/* Line 1806 of yacc.c */ +#line 253 "lib/conf-parse.y" + { (yyval.expr) = malloc_expr(); + (yyval.expr)->kind = sensors_kind_sub; + (yyval.expr)->data.subexpr.op = sensors_sub; + (yyval.expr)->data.subexpr.sub1 = (yyvsp[(1) - (3)].expr); + (yyval.expr)->data.subexpr.sub2 = (yyvsp[(3) - (3)].expr); + } + break; + + case 24: + +/* Line 1806 of yacc.c */ +#line 260 "lib/conf-parse.y" + { (yyval.expr) = malloc_expr(); + (yyval.expr)->kind = sensors_kind_sub; + (yyval.expr)->data.subexpr.op = sensors_multiply; + (yyval.expr)->data.subexpr.sub1 = (yyvsp[(1) - (3)].expr); + (yyval.expr)->data.subexpr.sub2 = (yyvsp[(3) - (3)].expr); + } + break; + + case 25: + +/* Line 1806 of yacc.c */ +#line 267 "lib/conf-parse.y" + { (yyval.expr) = malloc_expr(); + (yyval.expr)->kind = sensors_kind_sub; + (yyval.expr)->data.subexpr.op = sensors_divide; + (yyval.expr)->data.subexpr.sub1 = (yyvsp[(1) - (3)].expr); + (yyval.expr)->data.subexpr.sub2 = (yyvsp[(3) - (3)].expr); + } + break; + + case 26: + +/* Line 1806 of yacc.c */ +#line 274 "lib/conf-parse.y" + { (yyval.expr) = malloc_expr(); + (yyval.expr)->kind = sensors_kind_sub; + (yyval.expr)->data.subexpr.op = sensors_negate; + (yyval.expr)->data.subexpr.sub1 = (yyvsp[(2) - (2)].expr); + (yyval.expr)->data.subexpr.sub2 = NULL; + } + break; + + case 27: + +/* Line 1806 of yacc.c */ +#line 281 "lib/conf-parse.y" + { (yyval.expr) = (yyvsp[(2) - (3)].expr); } + break; + + case 28: + +/* Line 1806 of yacc.c */ +#line 283 "lib/conf-parse.y" + { (yyval.expr) = malloc_expr(); + (yyval.expr)->kind = sensors_kind_sub; + (yyval.expr)->data.subexpr.op = sensors_exp; + (yyval.expr)->data.subexpr.sub1 = (yyvsp[(2) - (2)].expr); + (yyval.expr)->data.subexpr.sub2 = NULL; + } + break; + + case 29: + +/* Line 1806 of yacc.c */ +#line 290 "lib/conf-parse.y" + { (yyval.expr) = malloc_expr(); + (yyval.expr)->kind = sensors_kind_sub; + (yyval.expr)->data.subexpr.op = sensors_log; + (yyval.expr)->data.subexpr.sub1 = (yyvsp[(2) - (2)].expr); + (yyval.expr)->data.subexpr.sub2 = NULL; + } + break; + + case 30: + +/* Line 1806 of yacc.c */ +#line 299 "lib/conf-parse.y" + { int res = sensors_parse_bus_id((yyvsp[(1) - (1)].name),&(yyval.bus)); + free((yyvsp[(1) - (1)].name)); + if (res) { + sensors_yyerror("Parse error in bus id"); + YYERROR; + } + } + break; + + case 31: + +/* Line 1806 of yacc.c */ +#line 309 "lib/conf-parse.y" + { (yyval.name) = (yyvsp[(1) - (1)].name); } + break; + + case 32: + +/* Line 1806 of yacc.c */ +#line 313 "lib/conf-parse.y" + { (yyval.name) = (yyvsp[(1) - (1)].name); } + break; + + case 33: + +/* Line 1806 of yacc.c */ +#line 317 "lib/conf-parse.y" + { (yyval.name) = (yyvsp[(1) - (1)].name); } + break; + + case 34: + +/* Line 1806 of yacc.c */ +#line 321 "lib/conf-parse.y" + { int res = sensors_parse_chip_name((yyvsp[(1) - (1)].name),&(yyval.chip)); + free((yyvsp[(1) - (1)].name)); + if (res) { + sensors_yyerror("Parse error in chip name"); + YYERROR; + } + } + break; + + + +/* Line 1806 of yacc.c */ +#line 1793 "lib/conf-parse.c" + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else +# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ + yyssp, yytoken) + { + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status; + yysyntax_error_status = YYSYNTAX_ERROR; + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == 1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); + if (!yymsg) + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = 2; + } + else + { + yysyntax_error_status = YYSYNTAX_ERROR; + yymsgp = yymsg; + } + } + yyerror (yymsgp); + if (yysyntax_error_status == 2) + goto yyexhaustedlab; + } +# undef YYSYNTAX_ERROR +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + } + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + + +/* Line 2067 of yacc.c */ +#line 330 "lib/conf-parse.y" + + +void sensors_yyerror(const char *err) +{ + if (sensors_lex_error[0]) { + sensors_parse_error_wfn(sensors_lex_error, sensors_yyfilename, sensors_yylineno); + sensors_lex_error[0] = '\0'; + } else + sensors_parse_error_wfn(err, sensors_yyfilename, sensors_yylineno); +} + +sensors_expr *malloc_expr(void) +{ + sensors_expr *res = malloc(sizeof(sensors_expr)); + if (! res) + sensors_fatal_error(__func__, "Allocating a new expression"); + return res; +} + diff --git a/tools/gator/daemon/libsensors/conf-parse.h b/tools/gator/daemon/libsensors/conf-parse.h new file mode 100644 index 00000000..89c9c1a0 --- /dev/null +++ b/tools/gator/daemon/libsensors/conf-parse.h @@ -0,0 +1,84 @@ +/* A Bison parser, made by GNU Bison 2.5. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + NEG = 258, + EOL = 259, + BUS = 260, + LABEL = 261, + SET = 262, + CHIP = 263, + COMPUTE = 264, + IGNORE = 265, + FLOAT = 266, + NAME = 267, + ERROR = 268 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 2068 of yacc.c */ +#line 79 "lib/conf-parse.y" + + double value; + char *name; + void *nothing; + sensors_chip_name_list chips; + sensors_expr *expr; + sensors_bus_id bus; + sensors_chip_name chip; + sensors_config_line line; + + + +/* Line 2068 of yacc.c */ +#line 76 "lib/conf-parse.h" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + +extern YYSTYPE sensors_yylval; + + diff --git a/tools/gator/daemon/libsensors/conf-parse.y b/tools/gator/daemon/libsensors/conf-parse.y new file mode 100644 index 00000000..1937f544 --- /dev/null +++ b/tools/gator/daemon/libsensors/conf-parse.y @@ -0,0 +1,347 @@ +%{ +/* + conf-parse.y - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#define YYERROR_VERBOSE + +#include +#include +#include + +#include "data.h" +#include "general.h" +#include "error.h" +#include "conf.h" +#include "access.h" +#include "init.h" + +static void sensors_yyerror(const char *err); +static sensors_expr *malloc_expr(void); + +static sensors_chip *current_chip = NULL; + +#define bus_add_el(el) sensors_add_array_el(el,\ + &sensors_config_busses,\ + &sensors_config_busses_count,\ + &sensors_config_busses_max,\ + sizeof(sensors_bus)) +#define label_add_el(el) sensors_add_array_el(el,\ + ¤t_chip->labels,\ + ¤t_chip->labels_count,\ + ¤t_chip->labels_max,\ + sizeof(sensors_label)); +#define set_add_el(el) sensors_add_array_el(el,\ + ¤t_chip->sets,\ + ¤t_chip->sets_count,\ + ¤t_chip->sets_max,\ + sizeof(sensors_set)); +#define compute_add_el(el) sensors_add_array_el(el,\ + ¤t_chip->computes,\ + ¤t_chip->computes_count,\ + ¤t_chip->computes_max,\ + sizeof(sensors_compute)); +#define ignore_add_el(el) sensors_add_array_el(el,\ + ¤t_chip->ignores,\ + ¤t_chip->ignores_count,\ + ¤t_chip->ignores_max,\ + sizeof(sensors_ignore)); +#define chip_add_el(el) sensors_add_array_el(el,\ + &sensors_config_chips,\ + &sensors_config_chips_count,\ + &sensors_config_chips_max,\ + sizeof(sensors_chip)); + +#define fits_add_el(el,list) sensors_add_array_el(el,\ + &(list).fits,\ + &(list).fits_count,\ + &(list).fits_max, \ + sizeof(sensors_chip_name)); + +%} + +%union { + double value; + char *name; + void *nothing; + sensors_chip_name_list chips; + sensors_expr *expr; + sensors_bus_id bus; + sensors_chip_name chip; + sensors_config_line line; +} + +%left '-' '+' +%left '*' '/' +%left NEG +%right '^' '`' + +%token ',' +%token EOL +%token BUS +%token LABEL +%token SET +%token CHIP +%token COMPUTE +%token IGNORE +%token FLOAT +%token NAME +%token ERROR + +%type chip_name_list +%type expression +%type bus_id +%type adapter_name +%type function_name +%type string +%type chip_name + +%start input + +%% + +input: /* empty */ + | input line +; + +line: bus_statement EOL + | label_statement EOL + | set_statement EOL + | chip_statement EOL + | compute_statement EOL + | ignore_statement EOL + | error EOL +; + +bus_statement: BUS bus_id adapter_name + { sensors_bus new_el; + new_el.line = $1; + new_el.bus = $2; + new_el.adapter = $3; + bus_add_el(&new_el); + } +; + +label_statement: LABEL function_name string + { sensors_label new_el; + if (!current_chip) { + sensors_yyerror("Label statement before first chip statement"); + free($2); + free($3); + YYERROR; + } + new_el.line = $1; + new_el.name = $2; + new_el.value = $3; + label_add_el(&new_el); + } +; + +set_statement: SET function_name expression + { sensors_set new_el; + if (!current_chip) { + sensors_yyerror("Set statement before first chip statement"); + free($2); + sensors_free_expr($3); + YYERROR; + } + new_el.line = $1; + new_el.name = $2; + new_el.value = $3; + set_add_el(&new_el); + } +; + +compute_statement: COMPUTE function_name expression ',' expression + { sensors_compute new_el; + if (!current_chip) { + sensors_yyerror("Compute statement before first chip statement"); + free($2); + sensors_free_expr($3); + sensors_free_expr($5); + YYERROR; + } + new_el.line = $1; + new_el.name = $2; + new_el.from_proc = $3; + new_el.to_proc = $5; + compute_add_el(&new_el); + } +; + +ignore_statement: IGNORE function_name + { sensors_ignore new_el; + if (!current_chip) { + sensors_yyerror("Ignore statement before first chip statement"); + free($2); + YYERROR; + } + new_el.line = $1; + new_el.name = $2; + ignore_add_el(&new_el); + } +; + +chip_statement: CHIP chip_name_list + { sensors_chip new_el; + new_el.line = $1; + new_el.labels = NULL; + new_el.sets = NULL; + new_el.computes = NULL; + new_el.ignores = NULL; + new_el.labels_count = new_el.labels_max = 0; + new_el.sets_count = new_el.sets_max = 0; + new_el.computes_count = new_el.computes_max = 0; + new_el.ignores_count = new_el.ignores_max = 0; + new_el.chips = $2; + chip_add_el(&new_el); + current_chip = sensors_config_chips + + sensors_config_chips_count - 1; + } +; + +chip_name_list: chip_name + { + $$.fits = NULL; + $$.fits_count = $$.fits_max = 0; + fits_add_el(&$1,$$); + } + | chip_name_list chip_name + { $$ = $1; + fits_add_el(&$2,$$); + } +; + +expression: FLOAT + { $$ = malloc_expr(); + $$->data.val = $1; + $$->kind = sensors_kind_val; + } + | NAME + { $$ = malloc_expr(); + $$->data.var = $1; + $$->kind = sensors_kind_var; + } + | '@' + { $$ = malloc_expr(); + $$->kind = sensors_kind_source; + } + | expression '+' expression + { $$ = malloc_expr(); + $$->kind = sensors_kind_sub; + $$->data.subexpr.op = sensors_add; + $$->data.subexpr.sub1 = $1; + $$->data.subexpr.sub2 = $3; + } + | expression '-' expression + { $$ = malloc_expr(); + $$->kind = sensors_kind_sub; + $$->data.subexpr.op = sensors_sub; + $$->data.subexpr.sub1 = $1; + $$->data.subexpr.sub2 = $3; + } + | expression '*' expression + { $$ = malloc_expr(); + $$->kind = sensors_kind_sub; + $$->data.subexpr.op = sensors_multiply; + $$->data.subexpr.sub1 = $1; + $$->data.subexpr.sub2 = $3; + } + | expression '/' expression + { $$ = malloc_expr(); + $$->kind = sensors_kind_sub; + $$->data.subexpr.op = sensors_divide; + $$->data.subexpr.sub1 = $1; + $$->data.subexpr.sub2 = $3; + } + | '-' expression %prec NEG + { $$ = malloc_expr(); + $$->kind = sensors_kind_sub; + $$->data.subexpr.op = sensors_negate; + $$->data.subexpr.sub1 = $2; + $$->data.subexpr.sub2 = NULL; + } + | '(' expression ')' + { $$ = $2; } + | '^' expression + { $$ = malloc_expr(); + $$->kind = sensors_kind_sub; + $$->data.subexpr.op = sensors_exp; + $$->data.subexpr.sub1 = $2; + $$->data.subexpr.sub2 = NULL; + } + | '`' expression + { $$ = malloc_expr(); + $$->kind = sensors_kind_sub; + $$->data.subexpr.op = sensors_log; + $$->data.subexpr.sub1 = $2; + $$->data.subexpr.sub2 = NULL; + } +; + +bus_id: NAME + { int res = sensors_parse_bus_id($1,&$$); + free($1); + if (res) { + sensors_yyerror("Parse error in bus id"); + YYERROR; + } + } +; + +adapter_name: NAME + { $$ = $1; } +; + +function_name: NAME + { $$ = $1; } +; + +string: NAME + { $$ = $1; } +; + +chip_name: NAME + { int res = sensors_parse_chip_name($1,&$$); + free($1); + if (res) { + sensors_yyerror("Parse error in chip name"); + YYERROR; + } + } +; + +%% + +void sensors_yyerror(const char *err) +{ + if (sensors_lex_error[0]) { + sensors_parse_error_wfn(sensors_lex_error, sensors_yyfilename, sensors_yylineno); + sensors_lex_error[0] = '\0'; + } else + sensors_parse_error_wfn(err, sensors_yyfilename, sensors_yylineno); +} + +sensors_expr *malloc_expr(void) +{ + sensors_expr *res = malloc(sizeof(sensors_expr)); + if (! res) + sensors_fatal_error(__func__, "Allocating a new expression"); + return res; +} diff --git a/tools/gator/daemon/libsensors/conf.h b/tools/gator/daemon/libsensors/conf.h new file mode 100644 index 00000000..b7ce4f7c --- /dev/null +++ b/tools/gator/daemon/libsensors/conf.h @@ -0,0 +1,34 @@ +/* + conf.h - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#ifndef LIB_SENSORS_CONF_H +#define LIB_SENSORS_CONF_H + +/* This is defined in conf-lex.l */ +int sensors_yylex(void); +extern char sensors_lex_error[]; +extern const char *sensors_yyfilename; +extern int sensors_yylineno; +extern FILE *sensors_yyin; + +/* This is defined in conf-parse.y */ +int sensors_yyparse(void); + +#endif /* LIB_SENSORS_CONF_H */ diff --git a/tools/gator/daemon/libsensors/data.c b/tools/gator/daemon/libsensors/data.c new file mode 100644 index 00000000..cac9c8dc --- /dev/null +++ b/tools/gator/daemon/libsensors/data.c @@ -0,0 +1,278 @@ +/* + data.c - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + Copyright (C) 2007, 2009 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +/*** This file modified by ARM on Jan 23, 2013 to move version.h to the current directory. ***/ + +/* this define needed for strndup() */ +#define _GNU_SOURCE + +#include +#include + +#include "access.h" +#include "error.h" +#include "data.h" +#include "sensors.h" +#include "version.h" + +const char *libsensors_version = LM_VERSION; + +char **sensors_config_files = NULL; +int sensors_config_files_count = 0; +int sensors_config_files_max = 0; + +sensors_chip *sensors_config_chips = NULL; +int sensors_config_chips_count = 0; +int sensors_config_chips_subst = 0; +int sensors_config_chips_max = 0; + +sensors_bus *sensors_config_busses = NULL; +int sensors_config_busses_count = 0; +int sensors_config_busses_max = 0; + +sensors_chip_features *sensors_proc_chips = NULL; +int sensors_proc_chips_count = 0; +int sensors_proc_chips_max = 0; + +sensors_bus *sensors_proc_bus = NULL; +int sensors_proc_bus_count = 0; +int sensors_proc_bus_max = 0; + +void sensors_free_chip_name(sensors_chip_name *chip) +{ + free(chip->prefix); +} + +/* + Parse a chip name to the internal representation. These are valid names: + + lm78-i2c-10-5e *-i2c-10-5e + lm78-i2c-10-* *-i2c-10-* + lm78-i2c-*-5e *-i2c-*-5e + lm78-i2c-*-* *-i2c-*-* + lm78-isa-10dd *-isa-10dd + lm78-isa-* *-isa-* + lm78-* *-* + + Here 'lm78' can be any prefix. 'i2c' and 'isa' are + literal strings, just like all dashes '-' and wildcards '*'. '10' can + be any decimal i2c bus number. '5e' can be any hexadecimal i2c device + address, and '10dd' any hexadecimal isa address. + + The 'prefix' part in the result is freshly allocated. All old contents + of res is overwritten. res itself is not allocated. In case of an error + return (ie. != 0), res is undefined, but all allocations are undone. +*/ + +int sensors_parse_chip_name(const char *name, sensors_chip_name *res) +{ + char *dash; + + /* First, the prefix. It's either "*" or a real chip name. */ + if (!strncmp(name, "*-", 2)) { + res->prefix = SENSORS_CHIP_NAME_PREFIX_ANY; + name += 2; + } else { + if (!(dash = strchr(name, '-'))) + return -SENSORS_ERR_CHIP_NAME; + res->prefix = strndup(name, dash - name); + if (!res->prefix) + sensors_fatal_error(__func__, + "Allocating name prefix"); + name = dash + 1; + } + + /* Then we have either a sole "*" (all chips with this name) or a bus + type and an address. */ + if (!strcmp(name, "*")) { + res->bus.type = SENSORS_BUS_TYPE_ANY; + res->bus.nr = SENSORS_BUS_NR_ANY; + res->addr = SENSORS_CHIP_NAME_ADDR_ANY; + return 0; + } + + if (!(dash = strchr(name, '-'))) + goto ERROR; + if (!strncmp(name, "i2c", dash - name)) + res->bus.type = SENSORS_BUS_TYPE_I2C; + else if (!strncmp(name, "isa", dash - name)) + res->bus.type = SENSORS_BUS_TYPE_ISA; + else if (!strncmp(name, "pci", dash - name)) + res->bus.type = SENSORS_BUS_TYPE_PCI; + else if (!strncmp(name, "spi", dash - name)) + res->bus.type = SENSORS_BUS_TYPE_SPI; + else if (!strncmp(name, "virtual", dash - name)) + res->bus.type = SENSORS_BUS_TYPE_VIRTUAL; + else if (!strncmp(name, "acpi", dash - name)) + res->bus.type = SENSORS_BUS_TYPE_ACPI; + else if (!strncmp(name, "hid", dash - name)) + res->bus.type = SENSORS_BUS_TYPE_HID; + else + goto ERROR; + name = dash + 1; + + /* Some bus types (i2c, spi) have an additional bus number. + For these, the next part is either a "*" (any bus of that type) + or a decimal number. */ + switch (res->bus.type) { + case SENSORS_BUS_TYPE_I2C: + case SENSORS_BUS_TYPE_SPI: + case SENSORS_BUS_TYPE_HID: + if (!strncmp(name, "*-", 2)) { + res->bus.nr = SENSORS_BUS_NR_ANY; + name += 2; + break; + } + + res->bus.nr = strtoul(name, &dash, 10); + if (*name == '\0' || *dash != '-' || res->bus.nr < 0) + goto ERROR; + name = dash + 1; + break; + default: + res->bus.nr = SENSORS_BUS_NR_ANY; + } + + /* Last part is the chip address, or "*" for any address. */ + if (!strcmp(name, "*")) { + res->addr = SENSORS_CHIP_NAME_ADDR_ANY; + } else { + res->addr = strtoul(name, &dash, 16); + if (*name == '\0' || *dash != '\0' || res->addr < 0) + goto ERROR; + } + + return 0; + +ERROR: + free(res->prefix); + return -SENSORS_ERR_CHIP_NAME; +} + +int sensors_snprintf_chip_name(char *str, size_t size, + const sensors_chip_name *chip) +{ + if (sensors_chip_name_has_wildcards(chip)) + return -SENSORS_ERR_WILDCARDS; + + switch (chip->bus.type) { + case SENSORS_BUS_TYPE_ISA: + return snprintf(str, size, "%s-isa-%04x", chip->prefix, + chip->addr); + case SENSORS_BUS_TYPE_PCI: + return snprintf(str, size, "%s-pci-%04x", chip->prefix, + chip->addr); + case SENSORS_BUS_TYPE_I2C: + return snprintf(str, size, "%s-i2c-%hd-%02x", chip->prefix, + chip->bus.nr, chip->addr); + case SENSORS_BUS_TYPE_SPI: + return snprintf(str, size, "%s-spi-%hd-%x", chip->prefix, + chip->bus.nr, chip->addr); + case SENSORS_BUS_TYPE_VIRTUAL: + return snprintf(str, size, "%s-virtual-%x", chip->prefix, + chip->addr); + case SENSORS_BUS_TYPE_ACPI: + return snprintf(str, size, "%s-acpi-%x", chip->prefix, + chip->addr); + case SENSORS_BUS_TYPE_HID: + return snprintf(str, size, "%s-hid-%hd-%x", chip->prefix, + chip->bus.nr, chip->addr); + } + + return -SENSORS_ERR_CHIP_NAME; +} + +int sensors_parse_bus_id(const char *name, sensors_bus_id *bus) +{ + char *endptr; + + if (strncmp(name, "i2c-", 4)) { + return -SENSORS_ERR_BUS_NAME; + } + name += 4; + bus->type = SENSORS_BUS_TYPE_I2C; + bus->nr = strtoul(name, &endptr, 10); + if (*name == '\0' || *endptr != '\0' || bus->nr < 0) + return -SENSORS_ERR_BUS_NAME; + return 0; +} + +static int sensors_substitute_chip(sensors_chip_name *name, + const char *filename, int lineno) +{ + int i, j; + for (i = 0; i < sensors_config_busses_count; i++) + if (sensors_config_busses[i].bus.type == name->bus.type && + sensors_config_busses[i].bus.nr == name->bus.nr) + break; + + if (i == sensors_config_busses_count) { + sensors_parse_error_wfn("Undeclared bus id referenced", + filename, lineno); + name->bus.nr = SENSORS_BUS_NR_IGNORE; + return -SENSORS_ERR_BUS_NAME; + } + + /* Compare the adapter names */ + for (j = 0; j < sensors_proc_bus_count; j++) { + if (!strcmp(sensors_config_busses[i].adapter, + sensors_proc_bus[j].adapter)) { + name->bus.nr = sensors_proc_bus[j].bus.nr; + return 0; + } + } + + /* We did not find a matching bus name, simply ignore this chip + config entry. */ + name->bus.nr = SENSORS_BUS_NR_IGNORE; + return 0; +} + +/* Bus substitution is on a per-configuration file basis, so we keep + memory (in sensors_config_chips_subst) of which chip entries have been + already substituted. */ +int sensors_substitute_busses(void) +{ + int err, i, j, lineno; + sensors_chip_name_list *chips; + const char *filename; + int res = 0; + + for (i = sensors_config_chips_subst; + i < sensors_config_chips_count; i++) { + filename = sensors_config_chips[i].line.filename; + lineno = sensors_config_chips[i].line.lineno; + chips = &sensors_config_chips[i].chips; + for (j = 0; j < chips->fits_count; j++) { + /* We can only substitute if a specific bus number + is given. */ + if (chips->fits[j].bus.nr == SENSORS_BUS_NR_ANY) + continue; + + err = sensors_substitute_chip(&chips->fits[j], + filename, lineno); + if (err) + res = err; + } + } + sensors_config_chips_subst = sensors_config_chips_count; + return res; +} diff --git a/tools/gator/daemon/libsensors/data.h b/tools/gator/daemon/libsensors/data.h new file mode 100644 index 00000000..4a23eabe --- /dev/null +++ b/tools/gator/daemon/libsensors/data.h @@ -0,0 +1,184 @@ +/* + data.h - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + Copyright (C) 2007, 2009 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#ifndef LIB_SENSORS_DATA_H +#define LIB_SENSORS_DATA_H + +#include "sensors.h" +#include "general.h" + +/* This header file contains all kinds of data structures which are used + for the representation of the config file data and the sensors + data. */ + +/* Kinds of expression operators recognized */ +typedef enum sensors_operation { + sensors_add, sensors_sub, sensors_multiply, sensors_divide, + sensors_negate, sensors_exp, sensors_log, +} sensors_operation; + +/* An expression can have several forms */ +typedef enum sensors_expr_kind { + sensors_kind_val, sensors_kind_source, sensors_kind_var, + sensors_kind_sub +} sensors_expr_kind; + +/* An expression. It is either a floating point value, a variable name, + an operation on subexpressions, or the special value 'sub' } */ +struct sensors_expr; + +typedef struct sensors_subexpr { + sensors_operation op; + struct sensors_expr *sub1; + struct sensors_expr *sub2; +} sensors_subexpr; + +typedef struct sensors_expr { + sensors_expr_kind kind; + union { + double val; + char *var; + sensors_subexpr subexpr; + } data; +} sensors_expr; + +/* Config file line reference */ +typedef struct sensors_config_line { + const char *filename; + int lineno; +} sensors_config_line; + +/* Config file label declaration: a feature name, combined with the label + value */ +typedef struct sensors_label { + char *name; + char *value; + sensors_config_line line; +} sensors_label; + +/* Config file set declaration: a subfeature name, combined with an + expression */ +typedef struct sensors_set { + char *name; + sensors_expr *value; + sensors_config_line line; +} sensors_set; + +/* Config file compute declaration: a feature name, combined with two + expressions */ +typedef struct sensors_compute { + char *name; + sensors_expr *from_proc; + sensors_expr *to_proc; + sensors_config_line line; +} sensors_compute; + +/* Config file ignore declaration: a feature name */ +typedef struct sensors_ignore { + char *name; + sensors_config_line line; +} sensors_ignore; + +/* A list of chip names, used to represent a config file chips declaration */ +typedef struct sensors_chip_name_list { + sensors_chip_name *fits; + int fits_count; + int fits_max; +} sensors_chip_name_list; + +/* A config file chip block */ +typedef struct sensors_chip { + sensors_chip_name_list chips; + sensors_label *labels; + int labels_count; + int labels_max; + sensors_set *sets; + int sets_count; + int sets_max; + sensors_compute *computes; + int computes_count; + int computes_max; + sensors_ignore *ignores; + int ignores_count; + int ignores_max; + sensors_config_line line; +} sensors_chip; + +/* Config file bus declaration: the bus type and number, combined with adapter + name */ +typedef struct sensors_bus { + char *adapter; + sensors_bus_id bus; + sensors_config_line line; +} sensors_bus; + +/* Internal data about all features and subfeatures of a chip */ +typedef struct sensors_chip_features { + struct sensors_chip_name chip; + struct sensors_feature *feature; + struct sensors_subfeature *subfeature; + int feature_count; + int subfeature_count; +} sensors_chip_features; + +extern char **sensors_config_files; +extern int sensors_config_files_count; +extern int sensors_config_files_max; + +#define sensors_add_config_files(el) sensors_add_array_el( \ + (el), &sensors_config_files, &sensors_config_files_count, \ + &sensors_config_files_max, sizeof(char *)) + +extern sensors_chip *sensors_config_chips; +extern int sensors_config_chips_count; +extern int sensors_config_chips_subst; +extern int sensors_config_chips_max; + +extern sensors_bus *sensors_config_busses; +extern int sensors_config_busses_count; +extern int sensors_config_busses_max; + +extern sensors_chip_features *sensors_proc_chips; +extern int sensors_proc_chips_count; +extern int sensors_proc_chips_max; + +#define sensors_add_proc_chips(el) sensors_add_array_el( \ + (el), &sensors_proc_chips, &sensors_proc_chips_count,\ + &sensors_proc_chips_max, sizeof(struct sensors_chip_features)) + +extern sensors_bus *sensors_proc_bus; +extern int sensors_proc_bus_count; +extern int sensors_proc_bus_max; + +#define sensors_add_proc_bus(el) sensors_add_array_el( \ + (el), &sensors_proc_bus, &sensors_proc_bus_count,\ + &sensors_proc_bus_max, sizeof(struct sensors_bus)) + +/* Substitute configuration bus numbers with real-world bus numbers + in the chips lists */ +int sensors_substitute_busses(void); + + +/* Parse a bus id into its components. Returns 0 on success, a value from + error.h on failure. */ +int sensors_parse_bus_id(const char *name, sensors_bus_id *bus); + +#endif /* def LIB_SENSORS_DATA_H */ diff --git a/tools/gator/daemon/libsensors/error.c b/tools/gator/daemon/libsensors/error.c new file mode 100644 index 00000000..55bde812 --- /dev/null +++ b/tools/gator/daemon/libsensors/error.c @@ -0,0 +1,92 @@ +/* + error.c - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + Copyright (C) 2007-2009 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#include +#include +#include "error.h" +#include "general.h" + +static void sensors_default_parse_error(const char *err, int lineno); +static void sensors_default_parse_error_wfn(const char *err, + const char *filename, int lineno); +static void sensors_default_fatal_error(const char *proc, const char *err); + +void (*sensors_parse_error) (const char *err, int lineno) = + sensors_default_parse_error; +void (*sensors_parse_error_wfn) (const char *err, const char *filename, + int lineno) = sensors_default_parse_error_wfn; +void (*sensors_fatal_error) (const char *proc, const char *err) = + sensors_default_fatal_error; + +static const char *errorlist[] = { + /* Invalid error code */ "Unknown error", + /* SENSORS_ERR_WILDCARDS */ "Wildcard found in chip name", + /* SENSORS_ERR_NO_ENTRY */ "No such subfeature known", + /* SENSORS_ERR_ACCESS_R */ "Can't read", + /* SENSORS_ERR_KERNEL */ "Kernel interface error", + /* SENSORS_ERR_DIV_ZERO */ "Divide by zero", + /* SENSORS_ERR_CHIP_NAME */ "Can't parse chip name", + /* SENSORS_ERR_BUS_NAME */ "Can't parse bus name", + /* SENSORS_ERR_PARSE */ "General parse error", + /* SENSORS_ERR_ACCESS_W */ "Can't write", + /* SENSORS_ERR_IO */ "I/O error", + /* SENSORS_ERR_RECURSION */ "Evaluation recurses too deep", +}; + +const char *sensors_strerror(int errnum) +{ + if (errnum < 0) + errnum = -errnum; + if (errnum >= ARRAY_SIZE(errorlist)) + errnum = 0; + return errorlist[errnum]; +} + +void sensors_default_parse_error(const char *err, int lineno) +{ + if (lineno) + fprintf(stderr, "Error: Line %d: %s\n", lineno, err); + else + fprintf(stderr, "Error: %s\n", err); +} + +void sensors_default_parse_error_wfn(const char *err, + const char *filename, int lineno) +{ + /* If application provided a custom parse error reporting function + but not the variant with the filename, fall back to the original + variant without the filename, for backwards compatibility. */ + if (sensors_parse_error != sensors_default_parse_error || + !filename) + return sensors_parse_error(err, lineno); + + if (lineno) + fprintf(stderr, "Error: File %s, line %d: %s\n", filename, + lineno, err); + else + fprintf(stderr, "Error: File %s: %s\n", filename, err); +} + +void sensors_default_fatal_error(const char *proc, const char *err) +{ + fprintf(stderr, "Fatal error in `%s': %s\n", proc, err); + exit(1); +} diff --git a/tools/gator/daemon/libsensors/error.h b/tools/gator/daemon/libsensors/error.h new file mode 100644 index 00000000..37cdc956 --- /dev/null +++ b/tools/gator/daemon/libsensors/error.h @@ -0,0 +1,74 @@ +/* + error.h - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + Copyright (C) 2007-2009 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#ifndef LIB_SENSORS_ERROR_H +#define LIB_SENSORS_ERROR_H + +#define SENSORS_ERR_WILDCARDS 1 /* Wildcard found in chip name */ +#define SENSORS_ERR_NO_ENTRY 2 /* No such subfeature known */ +#define SENSORS_ERR_ACCESS_R 3 /* Can't read */ +#define SENSORS_ERR_KERNEL 4 /* Kernel interface error */ +#define SENSORS_ERR_DIV_ZERO 5 /* Divide by zero */ +#define SENSORS_ERR_CHIP_NAME 6 /* Can't parse chip name */ +#define SENSORS_ERR_BUS_NAME 7 /* Can't parse bus name */ +#define SENSORS_ERR_PARSE 8 /* General parse error */ +#define SENSORS_ERR_ACCESS_W 9 /* Can't write */ +#define SENSORS_ERR_IO 10 /* I/O error */ +#define SENSORS_ERR_RECURSION 11 /* Evaluation recurses too deep */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/* This function returns a pointer to a string which describes the error. + errnum may be negative (the corresponding positive error is returned). + You may not modify the result! */ +const char *sensors_strerror(int errnum); + +/* These functions are called when a parse error is detected. Give them new + values, and your own functions are called instead of the default (which + print to stderr). These functions may terminate the program, but they + usually output an error and return. The first function is the original + one, the second one was added later when support for multiple + configuration files was added. + The library code now only calls the second function. However, for + backwards compatibility, if an application provides a custom handling + function for the first function but not the second, then all parse + errors will be reported using the first function (that is, the filename + is never reported.) + Note that filename can be NULL (if filename isn't known) and lineno + can be 0 (if the error occurs before the actual parsing starts.) */ +extern void (*sensors_parse_error) (const char *err, int lineno); +extern void (*sensors_parse_error_wfn) (const char *err, + const char *filename, int lineno); + +/* This function is called when an immediately fatal error (like no + memory left) is detected. Give it a new value, and your own function + is called instead of the default (which prints to stderr and ends + the program). Never let it return! */ +extern void (*sensors_fatal_error) (const char *proc, const char *err); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* def LIB_SENSORS_ERROR_H */ diff --git a/tools/gator/daemon/libsensors/general.c b/tools/gator/daemon/libsensors/general.c new file mode 100644 index 00000000..f237e3b5 --- /dev/null +++ b/tools/gator/daemon/libsensors/general.c @@ -0,0 +1,85 @@ +/* + general.c - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#include "error.h" +#include "general.h" +#include +#include +#include +#include + + +#define A_BUNCH 16 + +void sensors_malloc_array(void *list, int *num_el, int *max_el, int el_size) +{ + void **my_list = (void **)list; + + *my_list = malloc(el_size*A_BUNCH); + if (! *my_list) + sensors_fatal_error(__func__, "Allocating new elements"); + *max_el = A_BUNCH; + *num_el = 0; +} + +void sensors_free_array(void *list, int *num_el, int *max_el) +{ + void **my_list = (void **)list; + + free(*my_list); + *my_list = NULL; + *num_el = 0; + *max_el = 0; +} + +void sensors_add_array_el(const void *el, void *list, int *num_el, + int *max_el, int el_size) +{ + int new_max_el; + void **my_list = (void *)list; + if (*num_el + 1 > *max_el) { + new_max_el = *max_el + A_BUNCH; + *my_list = realloc(*my_list, new_max_el * el_size); + if (! *my_list) + sensors_fatal_error(__func__, + "Allocating new elements"); + *max_el = new_max_el; + } + memcpy(((char *) *my_list) + *num_el * el_size, el, el_size); + (*num_el) ++; +} + +void sensors_add_array_els(const void *els, int nr_els, void *list, + int *num_el, int *max_el, int el_size) +{ + int new_max_el; + void **my_list = (void *)list; + if (*num_el + nr_els > *max_el) { + new_max_el = (*max_el + nr_els + A_BUNCH); + new_max_el -= new_max_el % A_BUNCH; + *my_list = realloc(*my_list, new_max_el * el_size); + if (! *my_list) + sensors_fatal_error(__func__, + "Allocating new elements"); + *max_el = new_max_el; + } + memcpy(((char *)*my_list) + *num_el * el_size, els, el_size * nr_els); + *num_el += nr_els; +} diff --git a/tools/gator/daemon/libsensors/general.h b/tools/gator/daemon/libsensors/general.h new file mode 100644 index 00000000..a3971e02 --- /dev/null +++ b/tools/gator/daemon/libsensors/general.h @@ -0,0 +1,39 @@ +/* + general.h - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#ifndef LIB_SENSORS_GENERAL +#define LIB_SENSORS_GENERAL + +/* These are general purpose functions. They allow you to use variable- + length arrays, which are extended automatically. A distinction is + made between the current number of elements and the maximum number. + You can only add elements at the end. Primitive, but very useful + for internal use. */ +void sensors_malloc_array(void *list, int *num_el, int *max_el, + int el_size); +void sensors_free_array(void *list, int *num_el, int *max_el); +void sensors_add_array_el(const void *el, void *list, int *num_el, + int *max_el, int el_size); +void sensors_add_array_els(const void *els, int nr_els, void *list, + int *num_el, int *max_el, int el_size); + +#define ARRAY_SIZE(arr) (int)(sizeof(arr) / sizeof((arr)[0])) + +#endif /* LIB_SENSORS_GENERAL */ diff --git a/tools/gator/daemon/libsensors/init.c b/tools/gator/daemon/libsensors/init.c new file mode 100644 index 00000000..558046e7 --- /dev/null +++ b/tools/gator/daemon/libsensors/init.c @@ -0,0 +1,341 @@ +/* + init.c - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + Copyright (C) 2007, 2009 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +/*** This file modified by ARM on Jan 23, 2013 to cast alphasort to supress a warning as it's prototype is different on android. ***/ + +/* Needed for scandir() and alphasort() */ +#define _BSD_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "sensors.h" +#include "data.h" +#include "error.h" +#include "access.h" +#include "conf.h" +#include "sysfs.h" +#include "scanner.h" +#include "init.h" + +#define DEFAULT_CONFIG_FILE ETCDIR "/sensors3.conf" +#define ALT_CONFIG_FILE ETCDIR "/sensors.conf" +#define DEFAULT_CONFIG_DIR ETCDIR "/sensors.d" + +/* Wrapper around sensors_yyparse(), which clears the locale so that + the decimal numbers are always parsed properly. */ +static int sensors_parse(void) +{ + int res; + char *locale; + + /* Remember the current locale and clear it */ + locale = setlocale(LC_ALL, NULL); + if (locale) { + locale = strdup(locale); + if (!locale) + sensors_fatal_error(__func__, "Out of memory"); + + setlocale(LC_ALL, "C"); + } + + res = sensors_yyparse(); + + /* Restore the old locale */ + if (locale) { + setlocale(LC_ALL, locale); + free(locale); + } + + return res; +} + +static void free_bus(sensors_bus *bus) +{ + free(bus->adapter); +} + +static void free_config_busses(void) +{ + int i; + + for (i = 0; i < sensors_config_busses_count; i++) + free_bus(&sensors_config_busses[i]); + free(sensors_config_busses); + sensors_config_busses = NULL; + sensors_config_busses_count = sensors_config_busses_max = 0; +} + +static int parse_config(FILE *input, const char *name) +{ + int err; + char *name_copy; + + if (name) { + /* Record configuration file name for error reporting */ + name_copy = strdup(name); + if (!name_copy) + sensors_fatal_error(__func__, "Out of memory"); + sensors_add_config_files(&name_copy); + } else + name_copy = NULL; + + if (sensors_scanner_init(input, name_copy)) { + err = -SENSORS_ERR_PARSE; + goto exit_cleanup; + } + err = sensors_parse(); + sensors_scanner_exit(); + if (err) { + err = -SENSORS_ERR_PARSE; + goto exit_cleanup; + } + + err = sensors_substitute_busses(); + +exit_cleanup: + free_config_busses(); + return err; +} + +static int config_file_filter(const struct dirent *entry) +{ + return entry->d_name[0] != '.'; /* Skip hidden files */ +} + +static int add_config_from_dir(const char *dir) +{ + int count, res, i; + struct dirent **namelist; + + count = scandir(dir, &namelist, config_file_filter, (int (*)(const struct dirent **, const struct dirent **))alphasort); + if (count < 0) { + /* Do not return an error if directory does not exist */ + if (errno == ENOENT) + return 0; + + sensors_parse_error_wfn(strerror(errno), NULL, 0); + return -SENSORS_ERR_PARSE; + } + + for (res = 0, i = 0; !res && i < count; i++) { + int len; + char path[PATH_MAX]; + FILE *input; + struct stat st; + + len = snprintf(path, sizeof(path), "%s/%s", dir, + namelist[i]->d_name); + if (len < 0 || len >= (int)sizeof(path)) { + res = -SENSORS_ERR_PARSE; + continue; + } + + /* Only accept regular files */ + if (stat(path, &st) < 0 || !S_ISREG(st.st_mode)) + continue; + + input = fopen(path, "r"); + if (input) { + res = parse_config(input, path); + fclose(input); + } else { + res = -SENSORS_ERR_PARSE; + sensors_parse_error_wfn(strerror(errno), path, 0); + } + } + + /* Free memory allocated by scandir() */ + for (i = 0; i < count; i++) + free(namelist[i]); + free(namelist); + + return res; +} + +int sensors_init(FILE *input) +{ + int res; + + if (!sensors_init_sysfs()) + return -SENSORS_ERR_KERNEL; + if ((res = sensors_read_sysfs_bus()) || + (res = sensors_read_sysfs_chips())) + goto exit_cleanup; + + if (input) { + res = parse_config(input, NULL); + if (res) + goto exit_cleanup; + } else { + const char* name; + + /* No configuration provided, use default */ + input = fopen(name = DEFAULT_CONFIG_FILE, "r"); + if (!input && errno == ENOENT) + input = fopen(name = ALT_CONFIG_FILE, "r"); + if (input) { + res = parse_config(input, name); + fclose(input); + if (res) + goto exit_cleanup; + + } else if (errno != ENOENT) { + sensors_parse_error_wfn(strerror(errno), name, 0); + res = -SENSORS_ERR_PARSE; + goto exit_cleanup; + } + + /* Also check for files in default directory */ + res = add_config_from_dir(DEFAULT_CONFIG_DIR); + if (res) + goto exit_cleanup; + } + + return 0; + +exit_cleanup: + sensors_cleanup(); + return res; +} + +static void free_chip_name(sensors_chip_name *name) +{ + free(name->prefix); + free(name->path); +} + +static void free_chip_features(sensors_chip_features *features) +{ + int i; + + for (i = 0; i < features->subfeature_count; i++) + free(features->subfeature[i].name); + free(features->subfeature); + for (i = 0; i < features->feature_count; i++) + free(features->feature[i].name); + free(features->feature); +} + +static void free_label(sensors_label *label) +{ + free(label->name); + free(label->value); +} + +void sensors_free_expr(sensors_expr *expr) +{ + if (expr->kind == sensors_kind_var) + free(expr->data.var); + else if (expr->kind == sensors_kind_sub) { + if (expr->data.subexpr.sub1) + sensors_free_expr(expr->data.subexpr.sub1); + if (expr->data.subexpr.sub2) + sensors_free_expr(expr->data.subexpr.sub2); + } + free(expr); +} + +static void free_set(sensors_set *set) +{ + free(set->name); + sensors_free_expr(set->value); +} + +static void free_compute(sensors_compute *compute) +{ + free(compute->name); + sensors_free_expr(compute->from_proc); + sensors_free_expr(compute->to_proc); +} + +static void free_ignore(sensors_ignore *ignore) +{ + free(ignore->name); +} + +static void free_chip(sensors_chip *chip) +{ + int i; + + for (i = 0; i < chip->chips.fits_count; i++) + free_chip_name(&chip->chips.fits[i]); + free(chip->chips.fits); + chip->chips.fits_count = chip->chips.fits_max = 0; + + for (i = 0; i < chip->labels_count; i++) + free_label(&chip->labels[i]); + free(chip->labels); + chip->labels_count = chip->labels_max = 0; + + for (i = 0; i < chip->sets_count; i++) + free_set(&chip->sets[i]); + free(chip->sets); + chip->sets_count = chip->sets_max = 0; + + for (i = 0; i < chip->computes_count; i++) + free_compute(&chip->computes[i]); + free(chip->computes); + chip->computes_count = chip->computes_max = 0; + + for (i = 0; i < chip->ignores_count; i++) + free_ignore(&chip->ignores[i]); + free(chip->ignores); + chip->ignores_count = chip->ignores_max = 0; +} + +void sensors_cleanup(void) +{ + int i; + + for (i = 0; i < sensors_proc_chips_count; i++) { + free_chip_name(&sensors_proc_chips[i].chip); + free_chip_features(&sensors_proc_chips[i]); + } + free(sensors_proc_chips); + sensors_proc_chips = NULL; + sensors_proc_chips_count = sensors_proc_chips_max = 0; + + for (i = 0; i < sensors_config_chips_count; i++) + free_chip(&sensors_config_chips[i]); + free(sensors_config_chips); + sensors_config_chips = NULL; + sensors_config_chips_count = sensors_config_chips_max = 0; + sensors_config_chips_subst = 0; + + for (i = 0; i < sensors_proc_bus_count; i++) + free_bus(&sensors_proc_bus[i]); + free(sensors_proc_bus); + sensors_proc_bus = NULL; + sensors_proc_bus_count = sensors_proc_bus_max = 0; + + for (i = 0; i < sensors_config_files_count; i++) + free(sensors_config_files[i]); + free(sensors_config_files); + sensors_config_files = NULL; + sensors_config_files_count = sensors_config_files_max = 0; +} diff --git a/tools/gator/daemon/libsensors/init.h b/tools/gator/daemon/libsensors/init.h new file mode 100644 index 00000000..47006a62 --- /dev/null +++ b/tools/gator/daemon/libsensors/init.h @@ -0,0 +1,28 @@ +/* + init.h - Part of libsensors, a Linux library for reading sensor data. + Copyright (C) 2007 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#ifndef LIB_SENSORS_INIT_H +#define LIB_SENSORS_INIT_H + +#include "data.h" + +void sensors_free_expr(sensors_expr *expr); + +#endif /* def LIB_SENSORS_INIT_H */ diff --git a/tools/gator/daemon/libsensors/scanner.h b/tools/gator/daemon/libsensors/scanner.h new file mode 100644 index 00000000..4c415167 --- /dev/null +++ b/tools/gator/daemon/libsensors/scanner.h @@ -0,0 +1,32 @@ +/* + scanner.h - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 2006 Mark M. Hoffman + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +/*** This file modified by ARM on Jan 23, 2013 to fix input defined but not used warning from conf-lex.c. ***/ + +#ifndef LIB_SENSORS_SCANNER_H +#define LIB_SENSORS_SCANNER_H + +int sensors_scanner_init(FILE *input, const char *filename); +void sensors_scanner_exit(void); + +#define YY_NO_INPUT + +#endif + diff --git a/tools/gator/daemon/libsensors/sensors.h b/tools/gator/daemon/libsensors/sensors.h new file mode 100644 index 00000000..7874d028 --- /dev/null +++ b/tools/gator/daemon/libsensors/sensors.h @@ -0,0 +1,311 @@ +/* + sensors.h - Part of libsensors, a Linux library for reading sensor data. + Copyright (c) 1998, 1999 Frodo Looijaard + Copyright (C) 2007, 2010 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +/*** This file modified by ARM on Jan 23, 2013 to read non-scaled values. ***/ + +#ifndef LIB_SENSORS_SENSORS_H +#define LIB_SENSORS_SENSORS_H + +#include +#include + +/* Publicly accessible library functions */ + +/* libsensors API version define, first digit is the major version (changed + when the API + ABI breaks), the third digit is incremented to track small + API additions like new flags / enum values. The second digit is for tracking + larger additions like new methods. */ +#define SENSORS_API_VERSION 0x432 + +#define SENSORS_CHIP_NAME_PREFIX_ANY NULL +#define SENSORS_CHIP_NAME_ADDR_ANY (-1) + +#define SENSORS_BUS_TYPE_ANY (-1) +#define SENSORS_BUS_TYPE_I2C 0 +#define SENSORS_BUS_TYPE_ISA 1 +#define SENSORS_BUS_TYPE_PCI 2 +#define SENSORS_BUS_TYPE_SPI 3 +#define SENSORS_BUS_TYPE_VIRTUAL 4 +#define SENSORS_BUS_TYPE_ACPI 5 +#define SENSORS_BUS_TYPE_HID 6 +#define SENSORS_BUS_NR_ANY (-1) +#define SENSORS_BUS_NR_IGNORE (-2) + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern const char *libsensors_version; + +extern int sensors_sysfs_no_scaling; + +typedef struct sensors_bus_id { + short type; + short nr; +} sensors_bus_id; + +/* A chip name is encoded in this structure */ +typedef struct sensors_chip_name { + char *prefix; + sensors_bus_id bus; + int addr; + char *path; +} sensors_chip_name; + +/* Load the configuration file and the detected chips list. If this + returns a value unequal to zero, you are in trouble; you can not + assume anything will be initialized properly. If you want to + reload the configuration file, call sensors_cleanup() below before + calling sensors_init() again. */ +int sensors_init(FILE *input); + +/* Clean-up function: You can't access anything after + this, until the next sensors_init() call! */ +void sensors_cleanup(void); + +/* Parse a chip name to the internal representation. Return 0 on success, <0 + on error. */ +int sensors_parse_chip_name(const char *orig_name, sensors_chip_name *res); + +/* Free memory allocated for the internal representation of a chip name. */ +void sensors_free_chip_name(sensors_chip_name *chip); + +/* Print a chip name from its internal representation. Note that chip should + not contain wildcard values! Return the number of characters printed on + success (same as snprintf), <0 on error. */ +int sensors_snprintf_chip_name(char *str, size_t size, + const sensors_chip_name *chip); + +/* This function returns the adapter name of a bus, + as used within the sensors_chip_name structure. If it could not be found, + it returns NULL */ +const char *sensors_get_adapter_name(const sensors_bus_id *bus); + +typedef struct sensors_feature sensors_feature; + +/* Look up the label for a given feature. Note that chip should not + contain wildcard values! The returned string is newly allocated (free it + yourself). On failure, NULL is returned. + If no label exists for this feature, its name is returned itself. */ +char *sensors_get_label(const sensors_chip_name *name, + const sensors_feature *feature); + +/* Read the value of a subfeature of a certain chip. Note that chip should not + contain wildcard values! This function will return 0 on success, and <0 + on failure. */ +int sensors_get_value(const sensors_chip_name *name, int subfeat_nr, + double *value); + +/* Set the value of a subfeature of a certain chip. Note that chip should not + contain wildcard values! This function will return 0 on success, and <0 + on failure. */ +int sensors_set_value(const sensors_chip_name *name, int subfeat_nr, + double value); + +/* Execute all set statements for this particular chip. The chip may contain + wildcards! This function will return 0 on success, and <0 on failure. */ +int sensors_do_chip_sets(const sensors_chip_name *name); + +/* This function returns all detected chips that match a given chip name, + one by one. If no chip name is provided, all detected chips are returned. + To start at the beginning of the list, use 0 for nr; NULL is returned if + we are at the end of the list. Do not try to change these chip names, as + they point to internal structures! */ +const sensors_chip_name *sensors_get_detected_chips(const sensors_chip_name + *match, int *nr); + +/* These defines are used in the flags field of sensors_subfeature */ +#define SENSORS_MODE_R 1 +#define SENSORS_MODE_W 2 +#define SENSORS_COMPUTE_MAPPING 4 + +typedef enum sensors_feature_type { + SENSORS_FEATURE_IN = 0x00, + SENSORS_FEATURE_FAN = 0x01, + SENSORS_FEATURE_TEMP = 0x02, + SENSORS_FEATURE_POWER = 0x03, + SENSORS_FEATURE_ENERGY = 0x04, + SENSORS_FEATURE_CURR = 0x05, + SENSORS_FEATURE_HUMIDITY = 0x06, + SENSORS_FEATURE_MAX_MAIN, + SENSORS_FEATURE_VID = 0x10, + SENSORS_FEATURE_INTRUSION = 0x11, + SENSORS_FEATURE_MAX_OTHER, + SENSORS_FEATURE_BEEP_ENABLE = 0x18, + SENSORS_FEATURE_UNKNOWN = INT_MAX, +} sensors_feature_type; + +/* All the sensor types (in, fan, temp, vid) are a multiple of 0x100 apart, + and sensor subfeatures which have no compute mapping have bit 7 set. */ +typedef enum sensors_subfeature_type { + SENSORS_SUBFEATURE_IN_INPUT = SENSORS_FEATURE_IN << 8, + SENSORS_SUBFEATURE_IN_MIN, + SENSORS_SUBFEATURE_IN_MAX, + SENSORS_SUBFEATURE_IN_LCRIT, + SENSORS_SUBFEATURE_IN_CRIT, + SENSORS_SUBFEATURE_IN_AVERAGE, + SENSORS_SUBFEATURE_IN_LOWEST, + SENSORS_SUBFEATURE_IN_HIGHEST, + SENSORS_SUBFEATURE_IN_ALARM = (SENSORS_FEATURE_IN << 8) | 0x80, + SENSORS_SUBFEATURE_IN_MIN_ALARM, + SENSORS_SUBFEATURE_IN_MAX_ALARM, + SENSORS_SUBFEATURE_IN_BEEP, + SENSORS_SUBFEATURE_IN_LCRIT_ALARM, + SENSORS_SUBFEATURE_IN_CRIT_ALARM, + + SENSORS_SUBFEATURE_FAN_INPUT = SENSORS_FEATURE_FAN << 8, + SENSORS_SUBFEATURE_FAN_MIN, + SENSORS_SUBFEATURE_FAN_MAX, + SENSORS_SUBFEATURE_FAN_ALARM = (SENSORS_FEATURE_FAN << 8) | 0x80, + SENSORS_SUBFEATURE_FAN_FAULT, + SENSORS_SUBFEATURE_FAN_DIV, + SENSORS_SUBFEATURE_FAN_BEEP, + SENSORS_SUBFEATURE_FAN_PULSES, + SENSORS_SUBFEATURE_FAN_MIN_ALARM, + SENSORS_SUBFEATURE_FAN_MAX_ALARM, + + SENSORS_SUBFEATURE_TEMP_INPUT = SENSORS_FEATURE_TEMP << 8, + SENSORS_SUBFEATURE_TEMP_MAX, + SENSORS_SUBFEATURE_TEMP_MAX_HYST, + SENSORS_SUBFEATURE_TEMP_MIN, + SENSORS_SUBFEATURE_TEMP_CRIT, + SENSORS_SUBFEATURE_TEMP_CRIT_HYST, + SENSORS_SUBFEATURE_TEMP_LCRIT, + SENSORS_SUBFEATURE_TEMP_EMERGENCY, + SENSORS_SUBFEATURE_TEMP_EMERGENCY_HYST, + SENSORS_SUBFEATURE_TEMP_LOWEST, + SENSORS_SUBFEATURE_TEMP_HIGHEST, + SENSORS_SUBFEATURE_TEMP_ALARM = (SENSORS_FEATURE_TEMP << 8) | 0x80, + SENSORS_SUBFEATURE_TEMP_MAX_ALARM, + SENSORS_SUBFEATURE_TEMP_MIN_ALARM, + SENSORS_SUBFEATURE_TEMP_CRIT_ALARM, + SENSORS_SUBFEATURE_TEMP_FAULT, + SENSORS_SUBFEATURE_TEMP_TYPE, + SENSORS_SUBFEATURE_TEMP_OFFSET, + SENSORS_SUBFEATURE_TEMP_BEEP, + SENSORS_SUBFEATURE_TEMP_EMERGENCY_ALARM, + SENSORS_SUBFEATURE_TEMP_LCRIT_ALARM, + + SENSORS_SUBFEATURE_POWER_AVERAGE = SENSORS_FEATURE_POWER << 8, + SENSORS_SUBFEATURE_POWER_AVERAGE_HIGHEST, + SENSORS_SUBFEATURE_POWER_AVERAGE_LOWEST, + SENSORS_SUBFEATURE_POWER_INPUT, + SENSORS_SUBFEATURE_POWER_INPUT_HIGHEST, + SENSORS_SUBFEATURE_POWER_INPUT_LOWEST, + SENSORS_SUBFEATURE_POWER_CAP, + SENSORS_SUBFEATURE_POWER_CAP_HYST, + SENSORS_SUBFEATURE_POWER_MAX, + SENSORS_SUBFEATURE_POWER_CRIT, + SENSORS_SUBFEATURE_POWER_AVERAGE_INTERVAL = (SENSORS_FEATURE_POWER << 8) | 0x80, + SENSORS_SUBFEATURE_POWER_ALARM, + SENSORS_SUBFEATURE_POWER_CAP_ALARM, + SENSORS_SUBFEATURE_POWER_MAX_ALARM, + SENSORS_SUBFEATURE_POWER_CRIT_ALARM, + + SENSORS_SUBFEATURE_ENERGY_INPUT = SENSORS_FEATURE_ENERGY << 8, + + SENSORS_SUBFEATURE_CURR_INPUT = SENSORS_FEATURE_CURR << 8, + SENSORS_SUBFEATURE_CURR_MIN, + SENSORS_SUBFEATURE_CURR_MAX, + SENSORS_SUBFEATURE_CURR_LCRIT, + SENSORS_SUBFEATURE_CURR_CRIT, + SENSORS_SUBFEATURE_CURR_AVERAGE, + SENSORS_SUBFEATURE_CURR_LOWEST, + SENSORS_SUBFEATURE_CURR_HIGHEST, + SENSORS_SUBFEATURE_CURR_ALARM = (SENSORS_FEATURE_CURR << 8) | 0x80, + SENSORS_SUBFEATURE_CURR_MIN_ALARM, + SENSORS_SUBFEATURE_CURR_MAX_ALARM, + SENSORS_SUBFEATURE_CURR_BEEP, + SENSORS_SUBFEATURE_CURR_LCRIT_ALARM, + SENSORS_SUBFEATURE_CURR_CRIT_ALARM, + + SENSORS_SUBFEATURE_HUMIDITY_INPUT = SENSORS_FEATURE_HUMIDITY << 8, + + SENSORS_SUBFEATURE_VID = SENSORS_FEATURE_VID << 8, + + SENSORS_SUBFEATURE_INTRUSION_ALARM = SENSORS_FEATURE_INTRUSION << 8, + SENSORS_SUBFEATURE_INTRUSION_BEEP, + + SENSORS_SUBFEATURE_BEEP_ENABLE = SENSORS_FEATURE_BEEP_ENABLE << 8, + + SENSORS_SUBFEATURE_UNKNOWN = INT_MAX, +} sensors_subfeature_type; + +/* Data about a single chip feature (or category leader) */ +struct sensors_feature { + char *name; + int number; + sensors_feature_type type; + /* Members below are for libsensors internal use only */ + int first_subfeature; + int padding1; +}; + +/* Data about a single chip subfeature: + name is the string name used to refer to this subfeature (in config files) + number is the internal subfeature number, used in many functions to refer + to this subfeature + type is the subfeature type + mapping is the number of a main feature this subfeature belongs to + (for example subfeatures fan1_input, fan1_min, fan1_div and fan1_alarm + are mapped to main feature fan1) + flags is a bitfield, its value is a combination of SENSORS_MODE_R (readable), + SENSORS_MODE_W (writable) and SENSORS_COMPUTE_MAPPING (affected by the + computation rules of the main feature) */ +typedef struct sensors_subfeature { + char *name; + int number; + sensors_subfeature_type type; + int mapping; + unsigned int flags; +} sensors_subfeature; + +/* This returns all main features of a specific chip. nr is an internally + used variable. Set it to zero to start at the begin of the list. If no + more features are found NULL is returned. + Do not try to change the returned structure; you will corrupt internal + data structures. */ +const sensors_feature * +sensors_get_features(const sensors_chip_name *name, int *nr); + +/* This returns all subfeatures of a given main feature. nr is an internally + used variable. Set it to zero to start at the begin of the list. If no + more features are found NULL is returned. + Do not try to change the returned structure; you will corrupt internal + data structures. */ +const sensors_subfeature * +sensors_get_all_subfeatures(const sensors_chip_name *name, + const sensors_feature *feature, int *nr); + +/* This returns the subfeature of the given type for a given main feature, + if it exists, NULL otherwise. + Do not try to change the returned structure; you will corrupt internal + data structures. */ +const sensors_subfeature * +sensors_get_subfeature(const sensors_chip_name *name, + const sensors_feature *feature, + sensors_subfeature_type type); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* def LIB_SENSORS_ERROR_H */ diff --git a/tools/gator/daemon/libsensors/sysfs.c b/tools/gator/daemon/libsensors/sysfs.c new file mode 100644 index 00000000..2b494c99 --- /dev/null +++ b/tools/gator/daemon/libsensors/sysfs.c @@ -0,0 +1,926 @@ +/* + sysfs.c - Part of libsensors, a library for reading Linux sensor data + Copyright (c) 2005 Mark M. Hoffman + Copyright (C) 2007-2010 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +/*** This file modified by ARM on Jan 23, 2013 to improve performance by substituting calls to fread() with calls to read() and to read non-scaled values. ***/ + +/* this define needed for strndup() */ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "data.h" +#include "error.h" +#include "access.h" +#include "general.h" +#include "sysfs.h" + + +/****************************************************************************/ + +#define ATTR_MAX 128 +#define SYSFS_MAGIC 0x62656572 + +int sensors_sysfs_no_scaling; + +/* + * Read an attribute from sysfs + * Returns a pointer to a freshly allocated string; free it yourself. + * If the file doesn't exist or can't be read, NULL is returned. + */ +static char *sysfs_read_attr(const char *device, const char *attr) +{ + char path[NAME_MAX]; + char buf[ATTR_MAX], *p; + FILE *f; + + snprintf(path, NAME_MAX, "%s/%s", device, attr); + + if (!(f = fopen(path, "r"))) + return NULL; + p = fgets(buf, ATTR_MAX, f); + fclose(f); + if (!p) + return NULL; + + /* Last byte is a '\n'; chop that off */ + p = strndup(buf, strlen(buf) - 1); + if (!p) + sensors_fatal_error(__func__, "Out of memory"); + return p; +} + +/* + * Call an arbitrary function for each class device of the given class + * Returns 0 on success (all calls returned 0), a positive errno for + * local errors, or a negative error value if any call fails. + */ +static int sysfs_foreach_classdev(const char *class_name, + int (*func)(const char *, const char *)) +{ + char path[NAME_MAX]; + int path_off, ret; + DIR *dir; + struct dirent *ent; + + path_off = snprintf(path, NAME_MAX, "%s/class/%s", + sensors_sysfs_mount, class_name); + if (!(dir = opendir(path))) + return errno; + + ret = 0; + while (!ret && (ent = readdir(dir))) { + if (ent->d_name[0] == '.') /* skip hidden entries */ + continue; + + snprintf(path + path_off, NAME_MAX - path_off, "/%s", + ent->d_name); + ret = func(path, ent->d_name); + } + + closedir(dir); + return ret; +} + +/* + * Call an arbitrary function for each device of the given bus type + * Returns 0 on success (all calls returned 0), a positive errno for + * local errors, or a negative error value if any call fails. + */ +static int sysfs_foreach_busdev(const char *bus_type, + int (*func)(const char *, const char *)) +{ + char path[NAME_MAX]; + int path_off, ret; + DIR *dir; + struct dirent *ent; + + path_off = snprintf(path, NAME_MAX, "%s/bus/%s/devices", + sensors_sysfs_mount, bus_type); + if (!(dir = opendir(path))) + return errno; + + ret = 0; + while (!ret && (ent = readdir(dir))) { + if (ent->d_name[0] == '.') /* skip hidden entries */ + continue; + + snprintf(path + path_off, NAME_MAX - path_off, "/%s", + ent->d_name); + ret = func(path, ent->d_name); + } + + closedir(dir); + return ret; +} + +/****************************************************************************/ + +char sensors_sysfs_mount[NAME_MAX]; + +#define MAX_MAIN_SENSOR_TYPES (SENSORS_FEATURE_MAX_MAIN - SENSORS_FEATURE_IN) +#define MAX_OTHER_SENSOR_TYPES (SENSORS_FEATURE_MAX_OTHER - SENSORS_FEATURE_VID) +#define MAX_SENSORS_PER_TYPE 24 +/* max_subfeatures is now computed dynamically */ +#define FEATURE_SIZE (max_subfeatures * 2) +#define FEATURE_TYPE_SIZE (MAX_SENSORS_PER_TYPE * FEATURE_SIZE) + +/* + * Room for all 7 main types (in, fan, temp, power, energy, current, humidity) + * and 2 other types (VID, intrusion) with all their subfeatures + misc features + */ +#define SUB_OFFSET_OTHER (MAX_MAIN_SENSOR_TYPES * FEATURE_TYPE_SIZE) +#define SUB_OFFSET_MISC (SUB_OFFSET_OTHER + \ + MAX_OTHER_SENSOR_TYPES * FEATURE_TYPE_SIZE) +#define ALL_POSSIBLE_SUBFEATURES (SUB_OFFSET_MISC + 1) + +static +int get_type_scaling(sensors_subfeature_type type) +{ + /* Multipliers for subfeatures */ + switch (type & 0xFF80) { + case SENSORS_SUBFEATURE_IN_INPUT: + case SENSORS_SUBFEATURE_TEMP_INPUT: + case SENSORS_SUBFEATURE_CURR_INPUT: + case SENSORS_SUBFEATURE_HUMIDITY_INPUT: + return 1000; + case SENSORS_SUBFEATURE_FAN_INPUT: + return 1; + case SENSORS_SUBFEATURE_POWER_AVERAGE: + case SENSORS_SUBFEATURE_ENERGY_INPUT: + return 1000000; + } + + /* Multipliers for second class subfeatures + that need their own multiplier */ + switch (type) { + case SENSORS_SUBFEATURE_POWER_AVERAGE_INTERVAL: + case SENSORS_SUBFEATURE_VID: + case SENSORS_SUBFEATURE_TEMP_OFFSET: + return 1000; + default: + return 1; + } +} + +static +char *get_feature_name(sensors_feature_type ftype, char *sfname) +{ + char *name, *underscore; + + switch (ftype) { + case SENSORS_FEATURE_IN: + case SENSORS_FEATURE_FAN: + case SENSORS_FEATURE_TEMP: + case SENSORS_FEATURE_POWER: + case SENSORS_FEATURE_ENERGY: + case SENSORS_FEATURE_CURR: + case SENSORS_FEATURE_HUMIDITY: + case SENSORS_FEATURE_INTRUSION: + underscore = strchr(sfname, '_'); + name = strndup(sfname, underscore - sfname); + if (!name) + sensors_fatal_error(__func__, "Out of memory"); + + break; + default: + name = strdup(sfname); + if (!name) + sensors_fatal_error(__func__, "Out of memory"); + } + + return name; +} + +/* Static mappings for use by sensors_subfeature_get_type() */ +struct subfeature_type_match +{ + const char *name; + sensors_subfeature_type type; +}; + +struct feature_type_match +{ + const char *name; + const struct subfeature_type_match *submatches; +}; + +static const struct subfeature_type_match temp_matches[] = { + { "input", SENSORS_SUBFEATURE_TEMP_INPUT }, + { "max", SENSORS_SUBFEATURE_TEMP_MAX }, + { "max_hyst", SENSORS_SUBFEATURE_TEMP_MAX_HYST }, + { "min", SENSORS_SUBFEATURE_TEMP_MIN }, + { "crit", SENSORS_SUBFEATURE_TEMP_CRIT }, + { "crit_hyst", SENSORS_SUBFEATURE_TEMP_CRIT_HYST }, + { "lcrit", SENSORS_SUBFEATURE_TEMP_LCRIT }, + { "emergency", SENSORS_SUBFEATURE_TEMP_EMERGENCY }, + { "emergency_hyst", SENSORS_SUBFEATURE_TEMP_EMERGENCY_HYST }, + { "lowest", SENSORS_SUBFEATURE_TEMP_LOWEST }, + { "highest", SENSORS_SUBFEATURE_TEMP_HIGHEST }, + { "alarm", SENSORS_SUBFEATURE_TEMP_ALARM }, + { "min_alarm", SENSORS_SUBFEATURE_TEMP_MIN_ALARM }, + { "max_alarm", SENSORS_SUBFEATURE_TEMP_MAX_ALARM }, + { "crit_alarm", SENSORS_SUBFEATURE_TEMP_CRIT_ALARM }, + { "emergency_alarm", SENSORS_SUBFEATURE_TEMP_EMERGENCY_ALARM }, + { "lcrit_alarm", SENSORS_SUBFEATURE_TEMP_LCRIT_ALARM }, + { "fault", SENSORS_SUBFEATURE_TEMP_FAULT }, + { "type", SENSORS_SUBFEATURE_TEMP_TYPE }, + { "offset", SENSORS_SUBFEATURE_TEMP_OFFSET }, + { "beep", SENSORS_SUBFEATURE_TEMP_BEEP }, + { NULL, 0 } +}; + +static const struct subfeature_type_match in_matches[] = { + { "input", SENSORS_SUBFEATURE_IN_INPUT }, + { "min", SENSORS_SUBFEATURE_IN_MIN }, + { "max", SENSORS_SUBFEATURE_IN_MAX }, + { "lcrit", SENSORS_SUBFEATURE_IN_LCRIT }, + { "crit", SENSORS_SUBFEATURE_IN_CRIT }, + { "average", SENSORS_SUBFEATURE_IN_AVERAGE }, + { "lowest", SENSORS_SUBFEATURE_IN_LOWEST }, + { "highest", SENSORS_SUBFEATURE_IN_HIGHEST }, + { "alarm", SENSORS_SUBFEATURE_IN_ALARM }, + { "min_alarm", SENSORS_SUBFEATURE_IN_MIN_ALARM }, + { "max_alarm", SENSORS_SUBFEATURE_IN_MAX_ALARM }, + { "lcrit_alarm", SENSORS_SUBFEATURE_IN_LCRIT_ALARM }, + { "crit_alarm", SENSORS_SUBFEATURE_IN_CRIT_ALARM }, + { "beep", SENSORS_SUBFEATURE_IN_BEEP }, + { NULL, 0 } +}; + +static const struct subfeature_type_match fan_matches[] = { + { "input", SENSORS_SUBFEATURE_FAN_INPUT }, + { "min", SENSORS_SUBFEATURE_FAN_MIN }, + { "max", SENSORS_SUBFEATURE_FAN_MAX }, + { "div", SENSORS_SUBFEATURE_FAN_DIV }, + { "pulses", SENSORS_SUBFEATURE_FAN_PULSES }, + { "alarm", SENSORS_SUBFEATURE_FAN_ALARM }, + { "min_alarm", SENSORS_SUBFEATURE_FAN_MIN_ALARM }, + { "max_alarm", SENSORS_SUBFEATURE_FAN_MAX_ALARM }, + { "fault", SENSORS_SUBFEATURE_FAN_FAULT }, + { "beep", SENSORS_SUBFEATURE_FAN_BEEP }, + { NULL, 0 } +}; + +static const struct subfeature_type_match power_matches[] = { + { "average", SENSORS_SUBFEATURE_POWER_AVERAGE }, + { "average_highest", SENSORS_SUBFEATURE_POWER_AVERAGE_HIGHEST }, + { "average_lowest", SENSORS_SUBFEATURE_POWER_AVERAGE_LOWEST }, + { "input", SENSORS_SUBFEATURE_POWER_INPUT }, + { "input_highest", SENSORS_SUBFEATURE_POWER_INPUT_HIGHEST }, + { "input_lowest", SENSORS_SUBFEATURE_POWER_INPUT_LOWEST }, + { "cap", SENSORS_SUBFEATURE_POWER_CAP }, + { "cap_hyst", SENSORS_SUBFEATURE_POWER_CAP_HYST }, + { "cap_alarm", SENSORS_SUBFEATURE_POWER_CAP_ALARM }, + { "alarm", SENSORS_SUBFEATURE_POWER_ALARM }, + { "max", SENSORS_SUBFEATURE_POWER_MAX }, + { "max_alarm", SENSORS_SUBFEATURE_POWER_MAX_ALARM }, + { "crit", SENSORS_SUBFEATURE_POWER_CRIT }, + { "crit_alarm", SENSORS_SUBFEATURE_POWER_CRIT_ALARM }, + { "average_interval", SENSORS_SUBFEATURE_POWER_AVERAGE_INTERVAL }, + { NULL, 0 } +}; + +static const struct subfeature_type_match energy_matches[] = { + { "input", SENSORS_SUBFEATURE_ENERGY_INPUT }, + { NULL, 0 } +}; + +static const struct subfeature_type_match curr_matches[] = { + { "input", SENSORS_SUBFEATURE_CURR_INPUT }, + { "min", SENSORS_SUBFEATURE_CURR_MIN }, + { "max", SENSORS_SUBFEATURE_CURR_MAX }, + { "lcrit", SENSORS_SUBFEATURE_CURR_LCRIT }, + { "crit", SENSORS_SUBFEATURE_CURR_CRIT }, + { "average", SENSORS_SUBFEATURE_CURR_AVERAGE }, + { "lowest", SENSORS_SUBFEATURE_CURR_LOWEST }, + { "highest", SENSORS_SUBFEATURE_CURR_HIGHEST }, + { "alarm", SENSORS_SUBFEATURE_CURR_ALARM }, + { "min_alarm", SENSORS_SUBFEATURE_CURR_MIN_ALARM }, + { "max_alarm", SENSORS_SUBFEATURE_CURR_MAX_ALARM }, + { "lcrit_alarm", SENSORS_SUBFEATURE_CURR_LCRIT_ALARM }, + { "crit_alarm", SENSORS_SUBFEATURE_CURR_CRIT_ALARM }, + { "beep", SENSORS_SUBFEATURE_CURR_BEEP }, + { NULL, 0 } +}; + +static const struct subfeature_type_match humidity_matches[] = { + { "input", SENSORS_SUBFEATURE_HUMIDITY_INPUT }, + { NULL, 0 } +}; + +static const struct subfeature_type_match cpu_matches[] = { + { "vid", SENSORS_SUBFEATURE_VID }, + { NULL, 0 } +}; + +static const struct subfeature_type_match intrusion_matches[] = { + { "alarm", SENSORS_SUBFEATURE_INTRUSION_ALARM }, + { "beep", SENSORS_SUBFEATURE_INTRUSION_BEEP }, + { NULL, 0 } +}; +static struct feature_type_match matches[] = { + { "temp%d%c", temp_matches }, + { "in%d%c", in_matches }, + { "fan%d%c", fan_matches }, + { "cpu%d%c", cpu_matches }, + { "power%d%c", power_matches }, + { "curr%d%c", curr_matches }, + { "energy%d%c", energy_matches }, + { "intrusion%d%c", intrusion_matches }, + { "humidity%d%c", humidity_matches }, +}; + +/* Return the subfeature type and channel number based on the subfeature + name */ +static +sensors_subfeature_type sensors_subfeature_get_type(const char *name, int *nr) +{ + char c; + int i, count; + const struct subfeature_type_match *submatches; + + /* Special case */ + if (!strcmp(name, "beep_enable")) { + *nr = 0; + return SENSORS_SUBFEATURE_BEEP_ENABLE; + } + + for (i = 0; i < ARRAY_SIZE(matches); i++) + if ((count = sscanf(name, matches[i].name, nr, &c))) + break; + + if (i == ARRAY_SIZE(matches) || count != 2 || c != '_') + return SENSORS_SUBFEATURE_UNKNOWN; /* no match */ + + submatches = matches[i].submatches; + name = strchr(name + 3, '_') + 1; + for (i = 0; submatches[i].name != NULL; i++) + if (!strcmp(name, submatches[i].name)) + return submatches[i].type; + + return SENSORS_SUBFEATURE_UNKNOWN; +} + +static int sensors_compute_max(void) +{ + int i, j, max, offset; + const struct subfeature_type_match *submatches; + sensors_feature_type ftype; + + max = 0; + for (i = 0; i < ARRAY_SIZE(matches); i++) { + submatches = matches[i].submatches; + for (j = 0; submatches[j].name != NULL; j++) { + ftype = submatches[j].type >> 8; + + if (ftype < SENSORS_FEATURE_VID) { + offset = submatches[j].type & 0x7F; + if (offset >= max) + max = offset + 1; + } else { + offset = submatches[j].type & 0xFF; + if (offset >= max * 2) + max = ((offset + 1) + 1) / 2; + } + } + } + + return max; +} + +static int sensors_get_attr_mode(const char *device, const char *attr) +{ + char path[NAME_MAX]; + struct stat st; + int mode = 0; + + snprintf(path, NAME_MAX, "%s/%s", device, attr); + if (!stat(path, &st)) { + if (st.st_mode & S_IRUSR) + mode |= SENSORS_MODE_R; + if (st.st_mode & S_IWUSR) + mode |= SENSORS_MODE_W; + } + return mode; +} + +static int sensors_read_dynamic_chip(sensors_chip_features *chip, + const char *dev_path) +{ + int i, fnum = 0, sfnum = 0, prev_slot; + static int max_subfeatures; + DIR *dir; + struct dirent *ent; + sensors_subfeature *all_subfeatures; + sensors_subfeature *dyn_subfeatures; + sensors_feature *dyn_features; + sensors_feature_type ftype; + sensors_subfeature_type sftype; + + if (!(dir = opendir(dev_path))) + return -errno; + + /* Dynamically figure out the max number of subfeatures */ + if (!max_subfeatures) + max_subfeatures = sensors_compute_max(); + + /* We use a large sparse table at first to store all found + subfeatures, so that we can store them sorted at type and index + and then later create a dense sorted table. */ + all_subfeatures = calloc(ALL_POSSIBLE_SUBFEATURES, + sizeof(sensors_subfeature)); + if (!all_subfeatures) + sensors_fatal_error(__func__, "Out of memory"); + + while ((ent = readdir(dir))) { + char *name; + int nr; + + /* Skip directories and symlinks */ + if (ent->d_type != DT_REG) + continue; + + name = ent->d_name; + + sftype = sensors_subfeature_get_type(name, &nr); + if (sftype == SENSORS_SUBFEATURE_UNKNOWN) + continue; + ftype = sftype >> 8; + + /* Adjust the channel number */ + switch (ftype) { + case SENSORS_FEATURE_FAN: + case SENSORS_FEATURE_TEMP: + case SENSORS_FEATURE_POWER: + case SENSORS_FEATURE_ENERGY: + case SENSORS_FEATURE_CURR: + case SENSORS_FEATURE_HUMIDITY: + nr--; + break; + default: + break; + } + + if (nr < 0 || nr >= MAX_SENSORS_PER_TYPE) { + /* More sensors of one type than MAX_SENSORS_PER_TYPE, + we have to ignore it */ +#ifdef DEBUG + sensors_fatal_error(__func__, + "Increase MAX_SENSORS_PER_TYPE!"); +#endif + continue; + } + + /* "calculate" a place to store the subfeature in our sparse, + sorted table */ + switch (ftype) { + case SENSORS_FEATURE_VID: + case SENSORS_FEATURE_INTRUSION: + i = SUB_OFFSET_OTHER + + (ftype - SENSORS_FEATURE_VID) * FEATURE_TYPE_SIZE + + nr * FEATURE_SIZE + (sftype & 0xFF); + break; + case SENSORS_FEATURE_BEEP_ENABLE: + i = SUB_OFFSET_MISC + + (ftype - SENSORS_FEATURE_BEEP_ENABLE); + break; + default: + i = ftype * FEATURE_TYPE_SIZE + + nr * FEATURE_SIZE + + ((sftype & 0x80) >> 7) * max_subfeatures + + (sftype & 0x7F); + } + + if (all_subfeatures[i].name) { +#ifdef DEBUG + sensors_fatal_error(__func__, "Duplicate subfeature"); +#endif + continue; + } + + /* fill in the subfeature members */ + all_subfeatures[i].type = sftype; + all_subfeatures[i].name = strdup(name); + if (!all_subfeatures[i].name) + sensors_fatal_error(__func__, "Out of memory"); + + /* Other and misc subfeatures are never scaled */ + if (sftype < SENSORS_SUBFEATURE_VID && !(sftype & 0x80)) + all_subfeatures[i].flags |= SENSORS_COMPUTE_MAPPING; + all_subfeatures[i].flags |= sensors_get_attr_mode(dev_path, name); + + sfnum++; + } + closedir(dir); + + if (!sfnum) { /* No subfeature */ + chip->subfeature = NULL; + goto exit_free; + } + + /* How many main features? */ + prev_slot = -1; + for (i = 0; i < ALL_POSSIBLE_SUBFEATURES; i++) { + if (!all_subfeatures[i].name) + continue; + + if (i >= SUB_OFFSET_MISC || i / FEATURE_SIZE != prev_slot) { + fnum++; + prev_slot = i / FEATURE_SIZE; + } + } + + dyn_subfeatures = calloc(sfnum, sizeof(sensors_subfeature)); + dyn_features = calloc(fnum, sizeof(sensors_feature)); + if (!dyn_subfeatures || !dyn_features) + sensors_fatal_error(__func__, "Out of memory"); + + /* Copy from the sparse array to the compact array */ + sfnum = 0; + fnum = -1; + prev_slot = -1; + for (i = 0; i < ALL_POSSIBLE_SUBFEATURES; i++) { + if (!all_subfeatures[i].name) + continue; + + /* New main feature? */ + if (i >= SUB_OFFSET_MISC || i / FEATURE_SIZE != prev_slot) { + ftype = all_subfeatures[i].type >> 8; + fnum++; + prev_slot = i / FEATURE_SIZE; + + dyn_features[fnum].name = get_feature_name(ftype, + all_subfeatures[i].name); + dyn_features[fnum].number = fnum; + dyn_features[fnum].first_subfeature = sfnum; + dyn_features[fnum].type = ftype; + } + + dyn_subfeatures[sfnum] = all_subfeatures[i]; + dyn_subfeatures[sfnum].number = sfnum; + /* Back to the feature */ + dyn_subfeatures[sfnum].mapping = fnum; + + sfnum++; + } + + chip->subfeature = dyn_subfeatures; + chip->subfeature_count = sfnum; + chip->feature = dyn_features; + chip->feature_count = ++fnum; + +exit_free: + free(all_subfeatures); + return 0; +} + +/* returns !0 if sysfs filesystem was found, 0 otherwise */ +int sensors_init_sysfs(void) +{ + struct statfs statfsbuf; + + snprintf(sensors_sysfs_mount, NAME_MAX, "%s", "/sys"); + if (statfs(sensors_sysfs_mount, &statfsbuf) < 0 + || statfsbuf.f_type != SYSFS_MAGIC) + return 0; + + return 1; +} + +/* returns: number of devices added (0 or 1) if successful, <0 otherwise */ +static int sensors_read_one_sysfs_chip(const char *dev_path, + const char *dev_name, + const char *hwmon_path) +{ + int domain, bus, slot, fn, vendor, product, id; + int err = -SENSORS_ERR_KERNEL; + char *bus_attr; + char bus_path[NAME_MAX]; + char linkpath[NAME_MAX]; + char subsys_path[NAME_MAX], *subsys; + int sub_len; + sensors_chip_features entry; + + /* ignore any device without name attribute */ + if (!(entry.chip.prefix = sysfs_read_attr(hwmon_path, "name"))) + return 0; + + entry.chip.path = strdup(hwmon_path); + if (!entry.chip.path) + sensors_fatal_error(__func__, "Out of memory"); + + if (dev_path == NULL) { + /* Virtual device */ + entry.chip.bus.type = SENSORS_BUS_TYPE_VIRTUAL; + entry.chip.bus.nr = 0; + /* For now we assume that virtual devices are unique */ + entry.chip.addr = 0; + goto done; + } + + /* Find bus type */ + snprintf(linkpath, NAME_MAX, "%s/subsystem", dev_path); + sub_len = readlink(linkpath, subsys_path, NAME_MAX - 1); + if (sub_len < 0 && errno == ENOENT) { + /* Fallback to "bus" link for kernels <= 2.6.17 */ + snprintf(linkpath, NAME_MAX, "%s/bus", dev_path); + sub_len = readlink(linkpath, subsys_path, NAME_MAX - 1); + } + if (sub_len < 0) { + /* Older kernels (<= 2.6.11) have neither the subsystem + symlink nor the bus symlink */ + if (errno == ENOENT) + subsys = NULL; + else + goto exit_free; + } else { + subsys_path[sub_len] = '\0'; + subsys = strrchr(subsys_path, '/') + 1; + } + + if ((!subsys || !strcmp(subsys, "i2c")) && + sscanf(dev_name, "%hd-%x", &entry.chip.bus.nr, + &entry.chip.addr) == 2) { + /* find out if legacy ISA or not */ + if (entry.chip.bus.nr == 9191) { + entry.chip.bus.type = SENSORS_BUS_TYPE_ISA; + entry.chip.bus.nr = 0; + } else { + entry.chip.bus.type = SENSORS_BUS_TYPE_I2C; + snprintf(bus_path, sizeof(bus_path), + "%s/class/i2c-adapter/i2c-%d/device", + sensors_sysfs_mount, entry.chip.bus.nr); + + if ((bus_attr = sysfs_read_attr(bus_path, "name"))) { + if (!strncmp(bus_attr, "ISA ", 4)) { + entry.chip.bus.type = SENSORS_BUS_TYPE_ISA; + entry.chip.bus.nr = 0; + } + + free(bus_attr); + } + } + } else + if ((!subsys || !strcmp(subsys, "spi")) && + sscanf(dev_name, "spi%hd.%d", &entry.chip.bus.nr, + &entry.chip.addr) == 2) { + /* SPI */ + entry.chip.bus.type = SENSORS_BUS_TYPE_SPI; + } else + if ((!subsys || !strcmp(subsys, "pci")) && + sscanf(dev_name, "%x:%x:%x.%x", &domain, &bus, &slot, &fn) == 4) { + /* PCI */ + entry.chip.addr = (domain << 16) + (bus << 8) + (slot << 3) + fn; + entry.chip.bus.type = SENSORS_BUS_TYPE_PCI; + entry.chip.bus.nr = 0; + } else + if ((!subsys || !strcmp(subsys, "platform") || + !strcmp(subsys, "of_platform"))) { + /* must be new ISA (platform driver) */ + if (sscanf(dev_name, "%*[a-z0-9_].%d", &entry.chip.addr) != 1) + entry.chip.addr = 0; + entry.chip.bus.type = SENSORS_BUS_TYPE_ISA; + entry.chip.bus.nr = 0; + } else if (subsys && !strcmp(subsys, "acpi")) { + entry.chip.bus.type = SENSORS_BUS_TYPE_ACPI; + /* For now we assume that acpi devices are unique */ + entry.chip.bus.nr = 0; + entry.chip.addr = 0; + } else + if (subsys && !strcmp(subsys, "hid") && + sscanf(dev_name, "%x:%x:%x.%x", &bus, &vendor, &product, &id) == 4) { + entry.chip.bus.type = SENSORS_BUS_TYPE_HID; + /* As of kernel 2.6.32, the hid device names don't look good */ + entry.chip.bus.nr = bus; + entry.chip.addr = id; + } else { + /* Ignore unknown device */ + err = 0; + goto exit_free; + } + +done: + if (sensors_read_dynamic_chip(&entry, hwmon_path) < 0) + goto exit_free; + if (!entry.subfeature) { /* No subfeature, discard chip */ + err = 0; + goto exit_free; + } + sensors_add_proc_chips(&entry); + + return 1; + +exit_free: + free(entry.chip.prefix); + free(entry.chip.path); + return err; +} + +static int sensors_add_hwmon_device_compat(const char *path, + const char *dev_name) +{ + int err; + + err = sensors_read_one_sysfs_chip(path, dev_name, path); + if (err < 0) + return err; + return 0; +} + +/* returns 0 if successful, !0 otherwise */ +static int sensors_read_sysfs_chips_compat(void) +{ + int ret; + + ret = sysfs_foreach_busdev("i2c", sensors_add_hwmon_device_compat); + if (ret && ret != ENOENT) + return -SENSORS_ERR_KERNEL; + + return 0; +} + +static int sensors_add_hwmon_device(const char *path, const char *classdev) +{ + char linkpath[NAME_MAX]; + char device[NAME_MAX], *device_p; + int dev_len, err; + (void)classdev; /* hide warning */ + + snprintf(linkpath, NAME_MAX, "%s/device", path); + dev_len = readlink(linkpath, device, NAME_MAX - 1); + if (dev_len < 0) { + /* No device link? Treat as virtual */ + err = sensors_read_one_sysfs_chip(NULL, NULL, path); + } else { + device[dev_len] = '\0'; + device_p = strrchr(device, '/') + 1; + + /* The attributes we want might be those of the hwmon class + device, or those of the device itself. */ + err = sensors_read_one_sysfs_chip(linkpath, device_p, path); + if (err == 0) + err = sensors_read_one_sysfs_chip(linkpath, device_p, + linkpath); + } + if (err < 0) + return err; + return 0; +} + +/* returns 0 if successful, !0 otherwise */ +int sensors_read_sysfs_chips(void) +{ + int ret; + + ret = sysfs_foreach_classdev("hwmon", sensors_add_hwmon_device); + if (ret == ENOENT) { + /* compatibility function for kernel 2.6.n where n <= 13 */ + return sensors_read_sysfs_chips_compat(); + } + + if (ret > 0) + ret = -SENSORS_ERR_KERNEL; + return ret; +} + +/* returns 0 if successful, !0 otherwise */ +static int sensors_add_i2c_bus(const char *path, const char *classdev) +{ + sensors_bus entry; + + if (sscanf(classdev, "i2c-%hd", &entry.bus.nr) != 1 || + entry.bus.nr == 9191) /* legacy ISA */ + return 0; + entry.bus.type = SENSORS_BUS_TYPE_I2C; + + /* Get the adapter name from the classdev "name" attribute + * (Linux 2.6.20 and later). If it fails, fall back to + * the device "name" attribute (for older kernels). */ + entry.adapter = sysfs_read_attr(path, "name"); + if (!entry.adapter) + entry.adapter = sysfs_read_attr(path, "device/name"); + if (entry.adapter) + sensors_add_proc_bus(&entry); + + return 0; +} + +/* returns 0 if successful, !0 otherwise */ +int sensors_read_sysfs_bus(void) +{ + int ret; + + ret = sysfs_foreach_classdev("i2c-adapter", sensors_add_i2c_bus); + if (ret == ENOENT) + ret = sysfs_foreach_busdev("i2c", sensors_add_i2c_bus); + if (ret && ret != ENOENT) + return -SENSORS_ERR_KERNEL; + + return 0; +} + +int sensors_read_sysfs_attr(const sensors_chip_name *name, + const sensors_subfeature *subfeature, + double *value) +{ + char n[NAME_MAX]; + int f; + + snprintf(n, NAME_MAX, "%s/%s", name->path, subfeature->name); + if ((f = open(n, O_RDONLY)) != -1) { + int res, err = 0; + char buf[512]; + int count; + + errno = 0; + if ((count = read(f, buf, sizeof(buf) - 1)) == -1) { + if (errno == EIO) + err = -SENSORS_ERR_IO; + else + err = -SENSORS_ERR_ACCESS_R; + } else { + buf[count] = '\0'; + errno = 0; + res = sscanf(buf, "%lf", value); + if (res == EOF && errno == EIO) + err = -SENSORS_ERR_IO; + else if (res != 1) + err = -SENSORS_ERR_ACCESS_R; + } + res = close(f); + if (err) + return err; + + if (res != 0) { + if (errno == EIO) + return -SENSORS_ERR_IO; + else + return -SENSORS_ERR_ACCESS_R; + } + if (!sensors_sysfs_no_scaling) + *value /= get_type_scaling(subfeature->type); + } else + return -SENSORS_ERR_KERNEL; + + return 0; +} + +int sensors_write_sysfs_attr(const sensors_chip_name *name, + const sensors_subfeature *subfeature, + double value) +{ + char n[NAME_MAX]; + FILE *f; + + snprintf(n, NAME_MAX, "%s/%s", name->path, subfeature->name); + if ((f = fopen(n, "w"))) { + int res, err = 0; + + if (!sensors_sysfs_no_scaling) + value *= get_type_scaling(subfeature->type); + res = fprintf(f, "%d", (int) value); + if (res == -EIO) + err = -SENSORS_ERR_IO; + else if (res < 0) + err = -SENSORS_ERR_ACCESS_W; + res = fclose(f); + if (err) + return err; + + if (res == EOF) { + if (errno == EIO) + return -SENSORS_ERR_IO; + else + return -SENSORS_ERR_ACCESS_W; + } + } else + return -SENSORS_ERR_KERNEL; + + return 0; +} diff --git a/tools/gator/daemon/libsensors/sysfs.h b/tools/gator/daemon/libsensors/sysfs.h new file mode 100644 index 00000000..38584afd --- /dev/null +++ b/tools/gator/daemon/libsensors/sysfs.h @@ -0,0 +1,43 @@ +/* + sysfs.h - part of libsensors, a library for reading Linux sensor data + Copyright (C) Mark M. Hoffman + Copyright (C) 2007 Jean Delvare + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser 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. +*/ + +#ifndef SENSORS_LIB_SYSFS_H +#define SENSORS_LIB_SYSFS_H + +extern char sensors_sysfs_mount[]; + +int sensors_init_sysfs(void); + +int sensors_read_sysfs_chips(void); + +int sensors_read_sysfs_bus(void); + +/* Read a value out of a sysfs attribute file */ +int sensors_read_sysfs_attr(const sensors_chip_name *name, + const sensors_subfeature *subfeature, + double *value); + +/* Write a value to a sysfs attribute file */ +int sensors_write_sysfs_attr(const sensors_chip_name *name, + const sensors_subfeature *subfeature, + double value); + +#endif /* !SENSORS_LIB_SYSFS_H */ diff --git a/tools/gator/daemon/libsensors/version.h b/tools/gator/daemon/libsensors/version.h new file mode 100644 index 00000000..76ceb08c --- /dev/null +++ b/tools/gator/daemon/libsensors/version.h @@ -0,0 +1 @@ +#define LM_VERSION "3.3.2" diff --git a/tools/gator/daemon/main.cpp b/tools/gator/daemon/main.cpp new file mode 100644 index 00000000..fbce1e15 --- /dev/null +++ b/tools/gator/daemon/main.cpp @@ -0,0 +1,584 @@ +/** + * Copyright (C) ARM Limited 2010-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "CCNDriver.h" +#include "Child.h" +#include "EventsXML.h" +#include "Logging.h" +#include "Monitor.h" +#include "OlySocket.h" +#include "OlyUtility.h" +#include "SessionData.h" +#include "Setup.h" + +extern Child* child; +static int shutdownFilesystem(); +static pthread_mutex_t numSessions_mutex; +static OlyServerSocket* sock = NULL; +static Monitor monitor; +static int numSessions = 0; +static bool driverRunningAtStart = false; +static bool driverMountedAtStart = false; + +struct cmdline_t { + char *module; + int port; + bool update; +}; + +#define DEFAULT_PORT 8080 + +void cleanUp() { + if (shutdownFilesystem() == -1) { + logg->logMessage("Error shutting down gator filesystem"); + } + delete sock; + delete util; + delete logg; +} + +// CTRL C Signal Handler +static void handler(int signum) { + logg->logMessage("Received signal %d, gator daemon exiting", signum); + + // Case 1: both child and parent receive the signal + if (numSessions > 0) { + // Arbitrary sleep of 1 second to give time for the child to exit; + // if something bad happens, continue the shutdown process regardless + sleep(1); + } + + // Case 2: only the parent received the signal + if (numSessions > 0) { + // Kill child threads - the first signal exits gracefully + logg->logMessage("Killing process group as %d child was running when signal was received", numSessions); + kill(0, SIGINT); + + // Give time for the child to exit + sleep(1); + + if (numSessions > 0) { + // The second signal force kills the child + logg->logMessage("Force kill the child"); + kill(0, SIGINT); + // Again, sleep for 1 second + sleep(1); + + if (numSessions > 0) { + // Something bad has really happened; the child is not exiting and therefore may hold the /dev/gator resource open + printf("Unable to kill the gatord child process, thus gator.ko may still be loaded.\n"); + } + } + } + + cleanUp(); + exit(0); +} + +// Child exit Signal Handler +static void child_exit(int) { + int status; + int pid = wait(&status); + if (pid != -1) { + pthread_mutex_lock(&numSessions_mutex); + numSessions--; + pthread_mutex_unlock(&numSessions_mutex); + logg->logMessage("Child process %d exited with status %d", pid, status); + } +} + +static const int UDP_REQ_PORT = 30001; + +typedef struct { + char rviHeader[8]; + uint32_t messageID; + uint8_t ethernetAddress[8]; + uint32_t ethernetType; + uint32_t dhcp; + char dhcpName[40]; + uint32_t ipAddress; + uint32_t defaultGateway; + uint32_t subnetMask; + uint32_t activeConnections; +} RVIConfigureInfo; + +static const char DST_REQ[] = { 'D', 'S', 'T', '_', 'R', 'E', 'Q', ' ', 0, 0, 0, 0x64 }; + +class UdpListener { +public: + UdpListener() : mDstAns(), mReq(-1) {} + + void setup(int port) { + mReq = udpPort(UDP_REQ_PORT); + + // Format the answer buffer + memset(&mDstAns, 0, sizeof(mDstAns)); + memcpy(mDstAns.rviHeader, "STR_ANS ", sizeof(mDstAns.rviHeader)); + if (gethostname(mDstAns.dhcpName, sizeof(mDstAns.dhcpName) - 1) != 0) { + logg->logError(__FILE__, __LINE__, "gethostname failed"); + handleException(); + } + // Subvert the defaultGateway field for the port number + if (port != DEFAULT_PORT) { + mDstAns.defaultGateway = port; + } + // Subvert the subnetMask field for the protocol version + mDstAns.subnetMask = PROTOCOL_VERSION; + } + + int getReq() const { + return mReq; + } + + void handle() { + char buf[128]; + struct sockaddr_in6 sockaddr; + socklen_t addrlen; + int read; + addrlen = sizeof(sockaddr); + read = recvfrom(mReq, &buf, sizeof(buf), 0, (struct sockaddr *)&sockaddr, &addrlen); + if (read < 0) { + logg->logError(__FILE__, __LINE__, "recvfrom failed"); + handleException(); + } else if ((read == 12) && (memcmp(buf, DST_REQ, sizeof(DST_REQ)) == 0)) { + // Don't care if sendto fails - gatord shouldn't exit because of it and Streamline will retry + sendto(mReq, &mDstAns, sizeof(mDstAns), 0, (struct sockaddr *)&sockaddr, addrlen); + } + } + + void close() { + ::close(mReq); + } + +private: + int udpPort(int port) { + int s; + struct sockaddr_in6 sockaddr; + int on; + int family = AF_INET6; + + s = socket_cloexec(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); + if (s == -1) { + family = AF_INET; + s = socket_cloexec(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (s == -1) { + logg->logError(__FILE__, __LINE__, "socket failed"); + handleException(); + } + } + + on = 1; + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)) != 0) { + logg->logError(__FILE__, __LINE__, "setsockopt failed"); + handleException(); + } + + memset((void*)&sockaddr, 0, sizeof(sockaddr)); + sockaddr.sin6_family = family; + sockaddr.sin6_port = htons(port); + sockaddr.sin6_addr = in6addr_any; + if (bind(s, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0) { + logg->logError(__FILE__, __LINE__, "socket failed"); + handleException(); + } + + return s; + } + + RVIConfigureInfo mDstAns; + int mReq; +}; + +static UdpListener udpListener; + +// retval: -1 = failure; 0 = was already mounted; 1 = successfully mounted +static int mountGatorFS() { + // If already mounted, + if (access("/dev/gator/buffer", F_OK) == 0) { + return 0; + } + + // else, mount the filesystem + mkdir("/dev/gator", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + if (mount("nodev", "/dev/gator", "gatorfs", 0, NULL) != 0) { + return -1; + } else { + return 1; + } +} + +static bool init_module (const char * const location) { + bool ret(false); + const int fd = open(location, O_RDONLY | O_CLOEXEC); + if (fd >= 0) { + struct stat st; + if (fstat(fd, &st) == 0) { + void * const p = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (p != MAP_FAILED) { + if (syscall(__NR_init_module, p, (unsigned long)st.st_size, "") == 0) { + ret = true; + } + munmap(p, st.st_size); + } + } + close(fd); + } + + return ret; +} + +static bool setupFilesystem(char* module) { + if (module) { + // unmount and rmmod if the module was specified on the commandline, i.e. ensure that the specified module is indeed running + shutdownFilesystem(); + + // if still mounted + if (access("/dev/gator/buffer", F_OK) == 0) { + logg->logError(__FILE__, __LINE__, "Unable to remove the running gator.ko. Manually remove the module or use the running module by not specifying one on the commandline"); + handleException(); + } + } + + const int retval = mountGatorFS(); + if (retval == 1) { + logg->logMessage("Driver already running at startup"); + driverRunningAtStart = true; + } else if (retval == 0) { + logg->logMessage("Driver already mounted at startup"); + driverRunningAtStart = driverMountedAtStart = true; + } else { + char command[256]; // arbitrarily large amount + char location[256]; // arbitrarily large amount + + if (module) { + strncpy(location, module, sizeof(location)); + } else { + // Is the driver co-located in the same directory? + if (util->getApplicationFullPath(location, sizeof(location)) != 0) { // allow some buffer space + logg->logMessage("Unable to determine the full path of gatord, the cwd will be used"); + } + strncat(location, "gator.ko", sizeof(location) - strlen(location) - 1); + } + + if (access(location, F_OK) == -1) { + if (module == NULL) { + // The gator kernel is not already loaded and unable to locate gator.ko in the default location + return false; + } else { + // gator location specified on the command line but it was not found + logg->logError(__FILE__, __LINE__, "gator module not found at %s", location); + handleException(); + } + } + + // Load driver + bool success = init_module(location); + if (!success) { + logg->logMessage("init_module failed, trying insmod"); + snprintf(command, sizeof(command), "insmod %s >/dev/null 2>&1", location); + if (system(command) != 0) { + logg->logMessage("Unable to load gator.ko driver with command: %s", command); + logg->logError(__FILE__, __LINE__, "Unable to load (insmod) gator.ko driver:\n >>> gator.ko must be built against the current kernel version & configuration\n >>> See dmesg for more details"); + handleException(); + } + } + + if (mountGatorFS() == -1) { + logg->logError(__FILE__, __LINE__, "Unable to mount the gator filesystem needed for profiling."); + handleException(); + } + } + + return true; +} + +static int shutdownFilesystem() { + if (driverMountedAtStart == false) { + umount("/dev/gator"); + } + if (driverRunningAtStart == false) { + if (syscall(__NR_delete_module, "gator", O_NONBLOCK) != 0) { + logg->logMessage("delete_module failed, trying rmmod"); + if (system("rmmod gator >/dev/null 2>&1") != 0) { + return -1; + } + } + } + + return 0; // success +} + +static const char OPTSTRING[] = "hvudap:s:c:e:m:o:"; + +static bool hasDebugFlag(int argc, char** argv) { + int c; + + optind = 1; + while ((c = getopt(argc, argv, OPTSTRING)) != -1) { + if (c == 'd') { + return true; + } + } + + return false; +} + +static struct cmdline_t parseCommandLine(int argc, char** argv) { + struct cmdline_t cmdline; + cmdline.port = DEFAULT_PORT; + cmdline.module = NULL; + cmdline.update = false; + char version_string[256]; // arbitrary length to hold the version information + int c; + + // build the version string + if (PROTOCOL_VERSION < PROTOCOL_DEV) { + snprintf(version_string, sizeof(version_string), "Streamline gatord version %d (DS-5 v5.%d)", PROTOCOL_VERSION, PROTOCOL_VERSION); + } else { + snprintf(version_string, sizeof(version_string), "Streamline gatord development version %d", PROTOCOL_VERSION); + } + + optind = 1; + while ((c = getopt(argc, argv, OPTSTRING)) != -1) { + switch (c) { + case 'c': + gSessionData->mConfigurationXMLPath = optarg; + break; + case 'd': + // Already handled + break; + case 'e': + gSessionData->mEventsXMLPath = optarg; + break; + case 'm': + cmdline.module = optarg; + break; + case 'p': + cmdline.port = strtol(optarg, NULL, 10); + break; + case 's': + gSessionData->mSessionXMLPath = optarg; + break; + case 'o': + gSessionData->mTargetPath = optarg; + break; + case 'u': + cmdline.update = true; + break; + case 'a': + gSessionData->mAllowCommands = true; + break; + case 'h': + case '?': + logg->logError(__FILE__, __LINE__, + "%s. All parameters are optional:\n" + "-c config_xml path and filename of the configuration.xml to use\n" + "-e events_xml path and filename of the events.xml to use\n" + "-h this help page\n" + "-m module path and filename of gator.ko\n" + "-p port_number port upon which the server listens; default is 8080\n" + "-s session_xml path and filename of a session.xml used for local capture\n" + "-o apc_dir path and name of the output for a local capture\n" + "-v version information\n" + "-d enable debug messages\n" + "-a allow the user user to provide a command to run at the start of a capture" + , version_string); + handleException(); + break; + case 'v': + logg->logError(__FILE__, __LINE__, version_string); + handleException(); + break; + } + } + + // Error checking + if (cmdline.port != DEFAULT_PORT && gSessionData->mSessionXMLPath != NULL) { + logg->logError(__FILE__, __LINE__, "Only a port or a session xml can be specified, not both"); + handleException(); + } + + if (gSessionData->mTargetPath != NULL && gSessionData->mSessionXMLPath == NULL) { + logg->logError(__FILE__, __LINE__, "Missing -s command line option required for a local capture."); + handleException(); + } + + if (optind < argc) { + logg->logError(__FILE__, __LINE__, "Unknown argument: %s. Use '-h' for help.", argv[optind]); + handleException(); + } + + return cmdline; +} + +static void handleClient() { + OlySocket client(sock->acceptConnection()); + + int pid = fork(); + if (pid < 0) { + // Error + logg->logError(__FILE__, __LINE__, "Fork process failed. Please power cycle the target device if this error persists."); + } else if (pid == 0) { + // Child + sock->closeServerSocket(); + udpListener.close(); + monitor.close(); + child = new Child(&client, numSessions + 1); + child->run(); + delete child; + exit(0); + } else { + // Parent + client.closeSocket(); + + pthread_mutex_lock(&numSessions_mutex); + numSessions++; + pthread_mutex_unlock(&numSessions_mutex); + + // Maximum number of connections is 2 + int wait = 0; + while (numSessions > 1) { + // Throttle until one of the children exits before continuing to accept another socket connection + logg->logMessage("%d sessions active!", numSessions); + if (wait++ >= 10) { // Wait no more than 10 seconds + // Kill last created child + kill(pid, SIGALRM); + break; + } + sleep(1); + } + } +} + +// Gator data flow: collector -> collector fifo -> sender +int main(int argc, char** argv) { + // Ensure proper signal handling by making gatord the process group leader + // e.g. it may not be the group leader when launched as 'sudo gatord' + setsid(); + + // Set up global thread-safe logging + logg = new Logging(hasDebugFlag(argc, argv)); + // Global data class + gSessionData = new SessionData(); + // Set up global utility class + util = new OlyUtility(); + + // Initialize drivers + new CCNDriver(); + + prctl(PR_SET_NAME, (unsigned long)&"gatord-main", 0, 0, 0); + pthread_mutex_init(&numSessions_mutex, NULL); + + signal(SIGINT, handler); + signal(SIGTERM, handler); + signal(SIGABRT, handler); + + // Set to high priority + if (setpriority(PRIO_PROCESS, syscall(__NR_gettid), -19) == -1) { + logg->logMessage("setpriority() failed"); + } + + // Parse the command line parameters + struct cmdline_t cmdline = parseCommandLine(argc, argv); + + if (cmdline.update) { + return update(argv[0]); + } + + // Verify root permissions + uid_t euid = geteuid(); + if (euid) { + logg->logError(__FILE__, __LINE__, "gatord must be launched with root privileges"); + handleException(); + } + + // Call before setting up the SIGCHLD handler, as system() spawns child processes + if (!setupFilesystem(cmdline.module)) { + logg->logMessage("Unable to setup gatorfs, trying perf"); + if (!gSessionData->perf.setup()) { + logg->logError(__FILE__, __LINE__, + "Unable to locate gator.ko driver:\n" + " >>> gator.ko should be co-located with gatord in the same directory\n" + " >>> OR insmod gator.ko prior to launching gatord\n" + " >>> OR specify the location of gator.ko on the command line\n" + " >>> OR run Linux 3.4 or later with perf (CONFIG_PERF_EVENTS and CONFIG_HW_PERF_EVENTS) and tracing (CONFIG_TRACING and CONFIG_CONTEXT_SWITCH_TRACER) support to collect data via userspace only"); + handleException(); + } + } + + { + EventsXML eventsXML; + mxml_node_t *xml = eventsXML.getTree(); + // Initialize all drivers + for (Driver *driver = Driver::getHead(); driver != NULL; driver = driver->getNext()) { + driver->readEvents(xml); + } + mxmlDelete(xml); + } + + // Handle child exit codes + signal(SIGCHLD, child_exit); + + // Ignore the SIGPIPE signal so that any send to a broken socket will return an error code instead of asserting a signal + // Handling the error at the send function call is much easier than trying to do anything intelligent in the sig handler + signal(SIGPIPE, SIG_IGN); + + // If the command line argument is a session xml file, no need to open a socket + if (gSessionData->mSessionXMLPath) { + child = new Child(); + child->run(); + delete child; + } else { + gSessionData->annotateListener.setup(); + sock = new OlyServerSocket(cmdline.port); + udpListener.setup(cmdline.port); + if (!monitor.init() || + !monitor.add(sock->getFd()) || + !monitor.add(udpListener.getReq()) || + !monitor.add(gSessionData->annotateListener.getFd()) || + false) { + logg->logError(__FILE__, __LINE__, "Monitor setup failed"); + handleException(); + } + // Forever loop, can be exited via a signal or exception + while (1) { + struct epoll_event events[2]; + logg->logMessage("Waiting on connection..."); + int ready = monitor.wait(events, ARRAY_LENGTH(events), -1); + if (ready < 0) { + logg->logError(__FILE__, __LINE__, "Monitor::wait failed"); + handleException(); + } + for (int i = 0; i < ready; ++i) { + if (events[i].data.fd == sock->getFd()) { + handleClient(); + } else if (events[i].data.fd == udpListener.getReq()) { + udpListener.handle(); + } else if (events[i].data.fd == gSessionData->annotateListener.getFd()) { + gSessionData->annotateListener.handle(); + } + } + } + } + + cleanUp(); + return 0; +} diff --git a/tools/gator/daemon/mxml/COPYING b/tools/gator/daemon/mxml/COPYING new file mode 100644 index 00000000..4d0aa78a --- /dev/null +++ b/tools/gator/daemon/mxml/COPYING @@ -0,0 +1,507 @@ + Mini-XML License + September 18, 2010 + + +The Mini-XML library and included programs are provided under the +terms of the GNU Library General Public License version 2 (LGPL2) +with the following exceptions: + + 1. Static linking of applications to the Mini-XML library +does not constitute a derivative work and does not require +the author to provide source code for the application, use +the shared Mini-XML libraries, or link their applications +against a user-supplied version of Mini-XML. + +If you link the application to a modified version of +Mini-XML, then the changes to Mini-XML must be provided +under the terms of the LGPL2 in sections 1, 2, and 4. + + 2. You do not have to provide a copy of the Mini-XML license +with programs that are linked to the Mini-XML library, nor +do you have to identify the Mini-XML license in your +program or documentation as required by section 6 of the +LGPL2. + + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + [This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, 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 library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, 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 companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete 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 distribute a copy of this License along with the +Library. + + 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 Library or any portion +of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +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 Library, 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 Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. 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. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library 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. + + 9. 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 Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +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. + + 11. 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 Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library 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 Library. + +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. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library 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. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library 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 Library +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 Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. 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 LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/tools/gator/daemon/mxml/config.h b/tools/gator/daemon/mxml/config.h new file mode 100644 index 00000000..ad6df1d7 --- /dev/null +++ b/tools/gator/daemon/mxml/config.h @@ -0,0 +1,96 @@ +/* config.h. Generated from config.h.in by configure. */ +/* + * "$Id: config.h.in 451 2014-01-04 21:50:06Z msweet $" + * + * Configuration file for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include + + +/* + * Version number... + */ + +#define MXML_VERSION "Mini-XML v2.8" + + +/* + * Inline function support... + */ + +#define inline + + +/* + * Long long support... + */ + +#define HAVE_LONG_LONG 1 + + +/* + * Do we have the snprintf() and vsnprintf() functions? + */ + +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 + + +/* + * Do we have the strXXX() functions? + */ + +#define HAVE_STRDUP 1 + + +/* + * Do we have threading support? + */ + +#define HAVE_PTHREAD_H 1 + + +/* + * Define prototypes for string functions as needed... + */ + +# ifndef HAVE_STRDUP +extern char *_mxml_strdup(const char *); +# define strdup _mxml_strdup +# endif /* !HAVE_STRDUP */ + +extern char *_mxml_strdupf(const char *, ...); +extern char *_mxml_vstrdupf(const char *, va_list); + +# ifndef HAVE_SNPRINTF +extern int _mxml_snprintf(char *, size_t, const char *, ...); +# define snprintf _mxml_snprintf +# endif /* !HAVE_SNPRINTF */ + +# ifndef HAVE_VSNPRINTF +extern int _mxml_vsnprintf(char *, size_t, const char *, va_list); +# define vsnprintf _mxml_vsnprintf +# endif /* !HAVE_VSNPRINTF */ + +/* + * End of "$Id: config.h.in 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-attr.c b/tools/gator/daemon/mxml/mxml-attr.c new file mode 100644 index 00000000..8e89cc14 --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-attr.c @@ -0,0 +1,314 @@ +/* + * "$Id: mxml-attr.c 451 2014-01-04 21:50:06Z msweet $" + * + * Attribute support code for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include "config.h" +#include "mxml.h" + + +/* + * Local functions... + */ + +static int mxml_set_attr(mxml_node_t *node, const char *name, + char *value); + + +/* + * 'mxmlElementDeleteAttr()' - Delete an attribute. + * + * @since Mini-XML 2.4@ + */ + +void +mxmlElementDeleteAttr(mxml_node_t *node,/* I - Element */ + const char *name)/* I - Attribute name */ +{ + int i; /* Looping var */ + mxml_attr_t *attr; /* Cirrent attribute */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlElementDeleteAttr(node=%p, name=\"%s\")\n", + node, name ? name : "(null)"); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!node || node->type != MXML_ELEMENT || !name) + return; + + /* + * Look for the attribute... + */ + + for (i = node->value.element.num_attrs, attr = node->value.element.attrs; + i > 0; + i --, attr ++) + { +#ifdef DEBUG + printf(" %s=\"%s\"\n", attr->name, attr->value); +#endif /* DEBUG */ + + if (!strcmp(attr->name, name)) + { + /* + * Delete this attribute... + */ + + free(attr->name); + free(attr->value); + + i --; + if (i > 0) + memmove(attr, attr + 1, i * sizeof(mxml_attr_t)); + + node->value.element.num_attrs --; + + if (node->value.element.num_attrs == 0) + free(node->value.element.attrs); + return; + } + } +} + + +/* + * 'mxmlElementGetAttr()' - Get an attribute. + * + * This function returns NULL if the node is not an element or the + * named attribute does not exist. + */ + +const char * /* O - Attribute value or NULL */ +mxmlElementGetAttr(mxml_node_t *node, /* I - Element node */ + const char *name) /* I - Name of attribute */ +{ + int i; /* Looping var */ + mxml_attr_t *attr; /* Cirrent attribute */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlElementGetAttr(node=%p, name=\"%s\")\n", + node, name ? name : "(null)"); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!node || node->type != MXML_ELEMENT || !name) + return (NULL); + + /* + * Look for the attribute... + */ + + for (i = node->value.element.num_attrs, attr = node->value.element.attrs; + i > 0; + i --, attr ++) + { +#ifdef DEBUG + printf(" %s=\"%s\"\n", attr->name, attr->value); +#endif /* DEBUG */ + + if (!strcmp(attr->name, name)) + { +#ifdef DEBUG + printf(" Returning \"%s\"!\n", attr->value); +#endif /* DEBUG */ + return (attr->value); + } + } + + /* + * Didn't find attribute, so return NULL... + */ + +#ifdef DEBUG + puts(" Returning NULL!\n"); +#endif /* DEBUG */ + + return (NULL); +} + + +/* + * 'mxmlElementSetAttr()' - Set an attribute. + * + * If the named attribute already exists, the value of the attribute + * is replaced by the new string value. The string value is copied + * into the element node. This function does nothing if the node is + * not an element. + */ + +void +mxmlElementSetAttr(mxml_node_t *node, /* I - Element node */ + const char *name, /* I - Name of attribute */ + const char *value) /* I - Attribute value */ +{ + char *valuec; /* Copy of value */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlElementSetAttr(node=%p, name=\"%s\", value=\"%s\")\n", + node, name ? name : "(null)", value ? value : "(null)"); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!node || node->type != MXML_ELEMENT || !name) + return; + + if (value) + valuec = strdup(value); + else + valuec = NULL; + + if (mxml_set_attr(node, name, valuec)) + free(valuec); +} + + +/* + * 'mxmlElementSetAttrf()' - Set an attribute with a formatted value. + * + * If the named attribute already exists, the value of the attribute + * is replaced by the new formatted string. The formatted string value is + * copied into the element node. This function does nothing if the node + * is not an element. + * + * @since Mini-XML 2.3@ + */ + +void +mxmlElementSetAttrf(mxml_node_t *node, /* I - Element node */ + const char *name, /* I - Name of attribute */ + const char *format,/* I - Printf-style attribute value */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Argument pointer */ + char *value; /* Value */ + + +#ifdef DEBUG + fprintf(stderr, + "mxmlElementSetAttrf(node=%p, name=\"%s\", format=\"%s\", ...)\n", + node, name ? name : "(null)", format ? format : "(null)"); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!node || node->type != MXML_ELEMENT || !name || !format) + return; + + /* + * Format the value... + */ + + va_start(ap, format); + value = _mxml_vstrdupf(format, ap); + va_end(ap); + + if (!value) + mxml_error("Unable to allocate memory for attribute '%s' in element %s!", + name, node->value.element.name); + else if (mxml_set_attr(node, name, value)) + free(value); +} + + +/* + * 'mxml_set_attr()' - Set or add an attribute name/value pair. + */ + +static int /* O - 0 on success, -1 on failure */ +mxml_set_attr(mxml_node_t *node, /* I - Element node */ + const char *name, /* I - Attribute name */ + char *value) /* I - Attribute value */ +{ + int i; /* Looping var */ + mxml_attr_t *attr; /* New attribute */ + + + /* + * Look for the attribute... + */ + + for (i = node->value.element.num_attrs, attr = node->value.element.attrs; + i > 0; + i --, attr ++) + if (!strcmp(attr->name, name)) + { + /* + * Free the old value as needed... + */ + + if (attr->value) + free(attr->value); + + attr->value = value; + + return (0); + } + + /* + * Add a new attribute... + */ + + if (node->value.element.num_attrs == 0) + attr = malloc(sizeof(mxml_attr_t)); + else + attr = realloc(node->value.element.attrs, + (node->value.element.num_attrs + 1) * sizeof(mxml_attr_t)); + + if (!attr) + { + mxml_error("Unable to allocate memory for attribute '%s' in element %s!", + name, node->value.element.name); + return (-1); + } + + node->value.element.attrs = attr; + attr += node->value.element.num_attrs; + + if ((attr->name = strdup(name)) == NULL) + { + mxml_error("Unable to allocate memory for attribute '%s' in element %s!", + name, node->value.element.name); + return (-1); + } + + attr->value = value; + + node->value.element.num_attrs ++; + + return (0); +} + + +/* + * End of "$Id: mxml-attr.c 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-entity.c b/tools/gator/daemon/mxml/mxml-entity.c new file mode 100644 index 00000000..0d11df6a --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-entity.c @@ -0,0 +1,449 @@ +/* + * "$Id: mxml-entity.c 451 2014-01-04 21:50:06Z msweet $" + * + * Character entity support code for Mini-XML, a small XML-like + * file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include "mxml-private.h" + + +/* + * 'mxmlEntityAddCallback()' - Add a callback to convert entities to Unicode. + */ + +int /* O - 0 on success, -1 on failure */ +mxmlEntityAddCallback( + mxml_entity_cb_t cb) /* I - Callback function to add */ +{ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + + + if (global->num_entity_cbs < (int)(sizeof(global->entity_cbs) / sizeof(global->entity_cbs[0]))) + { + global->entity_cbs[global->num_entity_cbs] = cb; + global->num_entity_cbs ++; + + return (0); + } + else + { + mxml_error("Unable to add entity callback!"); + + return (-1); + } +} + + +/* + * 'mxmlEntityGetName()' - Get the name that corresponds to the character value. + * + * If val does not need to be represented by a named entity, NULL is returned. + */ + +const char * /* O - Entity name or NULL */ +mxmlEntityGetName(int val) /* I - Character value */ +{ + switch (val) + { + case '&' : + return ("amp"); + + case '<' : + return ("lt"); + + case '>' : + return ("gt"); + + case '\"' : + return ("quot"); + + default : + return (NULL); + } +} + + +/* + * 'mxmlEntityGetValue()' - Get the character corresponding to a named entity. + * + * The entity name can also be a numeric constant. -1 is returned if the + * name is not known. + */ + +int /* O - Character value or -1 on error */ +mxmlEntityGetValue(const char *name) /* I - Entity name */ +{ + int i; /* Looping var */ + int ch; /* Character value */ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + + + for (i = 0; i < global->num_entity_cbs; i ++) + if ((ch = (global->entity_cbs[i])(name)) >= 0) + return (ch); + + return (-1); +} + + +/* + * 'mxmlEntityRemoveCallback()' - Remove a callback. + */ + +void +mxmlEntityRemoveCallback( + mxml_entity_cb_t cb) /* I - Callback function to remove */ +{ + int i; /* Looping var */ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + + + for (i = 0; i < global->num_entity_cbs; i ++) + if (cb == global->entity_cbs[i]) + { + /* + * Remove the callback... + */ + + global->num_entity_cbs --; + + if (i < global->num_entity_cbs) + memmove(global->entity_cbs + i, global->entity_cbs + i + 1, + (global->num_entity_cbs - i) * sizeof(global->entity_cbs[0])); + + return; + } +} + + +/* + * '_mxml_entity_cb()' - Lookup standard (X)HTML entities. + */ + +int /* O - Unicode value or -1 */ +_mxml_entity_cb(const char *name) /* I - Entity name */ +{ + int diff, /* Difference between names */ + current, /* Current entity in search */ + first, /* First entity in search */ + last; /* Last entity in search */ + static const struct + { + const char *name; /* Entity name */ + int val; /* Character value */ + } entities[] = + { + { "AElig", 198 }, + { "Aacute", 193 }, + { "Acirc", 194 }, + { "Agrave", 192 }, + { "Alpha", 913 }, + { "Aring", 197 }, + { "Atilde", 195 }, + { "Auml", 196 }, + { "Beta", 914 }, + { "Ccedil", 199 }, + { "Chi", 935 }, + { "Dagger", 8225 }, + { "Delta", 916 }, + { "Dstrok", 208 }, + { "ETH", 208 }, + { "Eacute", 201 }, + { "Ecirc", 202 }, + { "Egrave", 200 }, + { "Epsilon", 917 }, + { "Eta", 919 }, + { "Euml", 203 }, + { "Gamma", 915 }, + { "Iacute", 205 }, + { "Icirc", 206 }, + { "Igrave", 204 }, + { "Iota", 921 }, + { "Iuml", 207 }, + { "Kappa", 922 }, + { "Lambda", 923 }, + { "Mu", 924 }, + { "Ntilde", 209 }, + { "Nu", 925 }, + { "OElig", 338 }, + { "Oacute", 211 }, + { "Ocirc", 212 }, + { "Ograve", 210 }, + { "Omega", 937 }, + { "Omicron", 927 }, + { "Oslash", 216 }, + { "Otilde", 213 }, + { "Ouml", 214 }, + { "Phi", 934 }, + { "Pi", 928 }, + { "Prime", 8243 }, + { "Psi", 936 }, + { "Rho", 929 }, + { "Scaron", 352 }, + { "Sigma", 931 }, + { "THORN", 222 }, + { "Tau", 932 }, + { "Theta", 920 }, + { "Uacute", 218 }, + { "Ucirc", 219 }, + { "Ugrave", 217 }, + { "Upsilon", 933 }, + { "Uuml", 220 }, + { "Xi", 926 }, + { "Yacute", 221 }, + { "Yuml", 376 }, + { "Zeta", 918 }, + { "aacute", 225 }, + { "acirc", 226 }, + { "acute", 180 }, + { "aelig", 230 }, + { "agrave", 224 }, + { "alefsym", 8501 }, + { "alpha", 945 }, + { "amp", '&' }, + { "and", 8743 }, + { "ang", 8736 }, + { "apos", '\'' }, + { "aring", 229 }, + { "asymp", 8776 }, + { "atilde", 227 }, + { "auml", 228 }, + { "bdquo", 8222 }, + { "beta", 946 }, + { "brkbar", 166 }, + { "brvbar", 166 }, + { "bull", 8226 }, + { "cap", 8745 }, + { "ccedil", 231 }, + { "cedil", 184 }, + { "cent", 162 }, + { "chi", 967 }, + { "circ", 710 }, + { "clubs", 9827 }, + { "cong", 8773 }, + { "copy", 169 }, + { "crarr", 8629 }, + { "cup", 8746 }, + { "curren", 164 }, + { "dArr", 8659 }, + { "dagger", 8224 }, + { "darr", 8595 }, + { "deg", 176 }, + { "delta", 948 }, + { "diams", 9830 }, + { "die", 168 }, + { "divide", 247 }, + { "eacute", 233 }, + { "ecirc", 234 }, + { "egrave", 232 }, + { "empty", 8709 }, + { "emsp", 8195 }, + { "ensp", 8194 }, + { "epsilon", 949 }, + { "equiv", 8801 }, + { "eta", 951 }, + { "eth", 240 }, + { "euml", 235 }, + { "euro", 8364 }, + { "exist", 8707 }, + { "fnof", 402 }, + { "forall", 8704 }, + { "frac12", 189 }, + { "frac14", 188 }, + { "frac34", 190 }, + { "frasl", 8260 }, + { "gamma", 947 }, + { "ge", 8805 }, + { "gt", '>' }, + { "hArr", 8660 }, + { "harr", 8596 }, + { "hearts", 9829 }, + { "hellip", 8230 }, + { "hibar", 175 }, + { "iacute", 237 }, + { "icirc", 238 }, + { "iexcl", 161 }, + { "igrave", 236 }, + { "image", 8465 }, + { "infin", 8734 }, + { "int", 8747 }, + { "iota", 953 }, + { "iquest", 191 }, + { "isin", 8712 }, + { "iuml", 239 }, + { "kappa", 954 }, + { "lArr", 8656 }, + { "lambda", 955 }, + { "lang", 9001 }, + { "laquo", 171 }, + { "larr", 8592 }, + { "lceil", 8968 }, + { "ldquo", 8220 }, + { "le", 8804 }, + { "lfloor", 8970 }, + { "lowast", 8727 }, + { "loz", 9674 }, + { "lrm", 8206 }, + { "lsaquo", 8249 }, + { "lsquo", 8216 }, + { "lt", '<' }, + { "macr", 175 }, + { "mdash", 8212 }, + { "micro", 181 }, + { "middot", 183 }, + { "minus", 8722 }, + { "mu", 956 }, + { "nabla", 8711 }, + { "nbsp", 160 }, + { "ndash", 8211 }, + { "ne", 8800 }, + { "ni", 8715 }, + { "not", 172 }, + { "notin", 8713 }, + { "nsub", 8836 }, + { "ntilde", 241 }, + { "nu", 957 }, + { "oacute", 243 }, + { "ocirc", 244 }, + { "oelig", 339 }, + { "ograve", 242 }, + { "oline", 8254 }, + { "omega", 969 }, + { "omicron", 959 }, + { "oplus", 8853 }, + { "or", 8744 }, + { "ordf", 170 }, + { "ordm", 186 }, + { "oslash", 248 }, + { "otilde", 245 }, + { "otimes", 8855 }, + { "ouml", 246 }, + { "para", 182 }, + { "part", 8706 }, + { "permil", 8240 }, + { "perp", 8869 }, + { "phi", 966 }, + { "pi", 960 }, + { "piv", 982 }, + { "plusmn", 177 }, + { "pound", 163 }, + { "prime", 8242 }, + { "prod", 8719 }, + { "prop", 8733 }, + { "psi", 968 }, + { "quot", '\"' }, + { "rArr", 8658 }, + { "radic", 8730 }, + { "rang", 9002 }, + { "raquo", 187 }, + { "rarr", 8594 }, + { "rceil", 8969 }, + { "rdquo", 8221 }, + { "real", 8476 }, + { "reg", 174 }, + { "rfloor", 8971 }, + { "rho", 961 }, + { "rlm", 8207 }, + { "rsaquo", 8250 }, + { "rsquo", 8217 }, + { "sbquo", 8218 }, + { "scaron", 353 }, + { "sdot", 8901 }, + { "sect", 167 }, + { "shy", 173 }, + { "sigma", 963 }, + { "sigmaf", 962 }, + { "sim", 8764 }, + { "spades", 9824 }, + { "sub", 8834 }, + { "sube", 8838 }, + { "sum", 8721 }, + { "sup", 8835 }, + { "sup1", 185 }, + { "sup2", 178 }, + { "sup3", 179 }, + { "supe", 8839 }, + { "szlig", 223 }, + { "tau", 964 }, + { "there4", 8756 }, + { "theta", 952 }, + { "thetasym", 977 }, + { "thinsp", 8201 }, + { "thorn", 254 }, + { "tilde", 732 }, + { "times", 215 }, + { "trade", 8482 }, + { "uArr", 8657 }, + { "uacute", 250 }, + { "uarr", 8593 }, + { "ucirc", 251 }, + { "ugrave", 249 }, + { "uml", 168 }, + { "upsih", 978 }, + { "upsilon", 965 }, + { "uuml", 252 }, + { "weierp", 8472 }, + { "xi", 958 }, + { "yacute", 253 }, + { "yen", 165 }, + { "yuml", 255 }, + { "zeta", 950 }, + { "zwj", 8205 }, + { "zwnj", 8204 } + }; + + + /* + * Do a binary search for the named entity... + */ + + first = 0; + last = (int)(sizeof(entities) / sizeof(entities[0]) - 1); + + while ((last - first) > 1) + { + current = (first + last) / 2; + + if ((diff = strcmp(name, entities[current].name)) == 0) + return (entities[current].val); + else if (diff < 0) + last = current; + else + first = current; + } + + /* + * If we get here, there is a small chance that there is still + * a match; check first and last... + */ + + if (!strcmp(name, entities[first].name)) + return (entities[first].val); + else if (!strcmp(name, entities[last].name)) + return (entities[last].val); + else + return (-1); +} + + +/* + * End of "$Id: mxml-entity.c 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-file.c b/tools/gator/daemon/mxml/mxml-file.c new file mode 100644 index 00000000..3812c253 --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-file.c @@ -0,0 +1,3056 @@ +/* + * "$Id: mxml-file.c 455 2014-01-05 03:28:03Z msweet $" + * + * File loading code for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/*** This file modified by ARM on 25 Aug 2014 to avoid pointer overflow when checking if the write position is beyond the end of the buffer in mxmlSaveString and mxml_string_putc ***/ + +/* + * Include necessary headers... + */ + +#ifndef WIN32 +# include +#endif /* !WIN32 */ +#include "mxml-private.h" + + +/* + * Character encoding... + */ + +#define ENCODE_UTF8 0 /* UTF-8 */ +#define ENCODE_UTF16BE 1 /* UTF-16 Big-Endian */ +#define ENCODE_UTF16LE 2 /* UTF-16 Little-Endian */ + + +/* + * Macro to test for a bad XML character... + */ + +#define mxml_bad_char(ch) ((ch) < ' ' && (ch) != '\n' && (ch) != '\r' && (ch) != '\t') + + +/* + * Types and structures... + */ + +typedef int (*_mxml_getc_cb_t)(void *, int *); +typedef int (*_mxml_putc_cb_t)(int, void *); + +typedef struct _mxml_fdbuf_s /**** File descriptor buffer ****/ +{ + int fd; /* File descriptor */ + unsigned char *current, /* Current position in buffer */ + *end, /* End of buffer */ + buffer[8192]; /* Character buffer */ +} _mxml_fdbuf_t; + + +/* + * Local functions... + */ + +static int mxml_add_char(int ch, char **ptr, char **buffer, + int *bufsize); +static int mxml_fd_getc(void *p, int *encoding); +static int mxml_fd_putc(int ch, void *p); +static int mxml_fd_read(_mxml_fdbuf_t *buf); +static int mxml_fd_write(_mxml_fdbuf_t *buf); +static int mxml_file_getc(void *p, int *encoding); +static int mxml_file_putc(int ch, void *p); +static int mxml_get_entity(mxml_node_t *parent, void *p, + int *encoding, + _mxml_getc_cb_t getc_cb); +static inline int mxml_isspace(int ch) + { + return (ch == ' ' || ch == '\t' || ch == '\r' || + ch == '\n'); + } +static mxml_node_t *mxml_load_data(mxml_node_t *top, void *p, + mxml_load_cb_t cb, + _mxml_getc_cb_t getc_cb, + mxml_sax_cb_t sax_cb, void *sax_data); +static int mxml_parse_element(mxml_node_t *node, void *p, + int *encoding, + _mxml_getc_cb_t getc_cb); +static int mxml_string_getc(void *p, int *encoding); +static int mxml_string_putc(int ch, void *p); +static int mxml_write_name(const char *s, void *p, + _mxml_putc_cb_t putc_cb); +static int mxml_write_node(mxml_node_t *node, void *p, + mxml_save_cb_t cb, int col, + _mxml_putc_cb_t putc_cb, + _mxml_global_t *global); +static int mxml_write_string(const char *s, void *p, + _mxml_putc_cb_t putc_cb); +static int mxml_write_ws(mxml_node_t *node, void *p, + mxml_save_cb_t cb, int ws, + int col, _mxml_putc_cb_t putc_cb); + + +/* + * 'mxmlLoadFd()' - Load a file descriptor into an XML node tree. + * + * The nodes in the specified file are added to the specified top node. + * If no top node is provided, the XML file MUST be well-formed with a + * single parent node like for the entire file. The callback + * function returns the value type that should be used for child nodes. + * If MXML_NO_CALLBACK is specified then all child nodes will be either + * MXML_ELEMENT or MXML_TEXT nodes. + * + * The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, + * MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading + * child nodes of the specified type. + */ + +mxml_node_t * /* O - First node or NULL if the file could not be read. */ +mxmlLoadFd(mxml_node_t *top, /* I - Top node */ + int fd, /* I - File descriptor to read from */ + mxml_load_cb_t cb) /* I - Callback function or MXML_NO_CALLBACK */ +{ + _mxml_fdbuf_t buf; /* File descriptor buffer */ + + + /* + * Initialize the file descriptor buffer... + */ + + buf.fd = fd; + buf.current = buf.buffer; + buf.end = buf.buffer; + + /* + * Read the XML data... + */ + + return (mxml_load_data(top, &buf, cb, mxml_fd_getc, MXML_NO_CALLBACK, NULL)); +} + + +/* + * 'mxmlLoadFile()' - Load a file into an XML node tree. + * + * The nodes in the specified file are added to the specified top node. + * If no top node is provided, the XML file MUST be well-formed with a + * single parent node like for the entire file. The callback + * function returns the value type that should be used for child nodes. + * If MXML_NO_CALLBACK is specified then all child nodes will be either + * MXML_ELEMENT or MXML_TEXT nodes. + * + * The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, + * MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading + * child nodes of the specified type. + */ + +mxml_node_t * /* O - First node or NULL if the file could not be read. */ +mxmlLoadFile(mxml_node_t *top, /* I - Top node */ + FILE *fp, /* I - File to read from */ + mxml_load_cb_t cb) /* I - Callback function or MXML_NO_CALLBACK */ +{ + /* + * Read the XML data... + */ + + return (mxml_load_data(top, fp, cb, mxml_file_getc, MXML_NO_CALLBACK, NULL)); +} + + +/* + * 'mxmlLoadString()' - Load a string into an XML node tree. + * + * The nodes in the specified string are added to the specified top node. + * If no top node is provided, the XML string MUST be well-formed with a + * single parent node like for the entire string. The callback + * function returns the value type that should be used for child nodes. + * If MXML_NO_CALLBACK is specified then all child nodes will be either + * MXML_ELEMENT or MXML_TEXT nodes. + * + * The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, + * MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading + * child nodes of the specified type. + */ + +mxml_node_t * /* O - First node or NULL if the string has errors. */ +mxmlLoadString(mxml_node_t *top, /* I - Top node */ + const char *s, /* I - String to load */ + mxml_load_cb_t cb) /* I - Callback function or MXML_NO_CALLBACK */ +{ + /* + * Read the XML data... + */ + + return (mxml_load_data(top, (void *)&s, cb, mxml_string_getc, MXML_NO_CALLBACK, + NULL)); +} + + +/* + * 'mxmlSaveAllocString()' - Save an XML tree to an allocated string. + * + * This function returns a pointer to a string containing the textual + * representation of the XML node tree. The string should be freed + * using the free() function when you are done with it. NULL is returned + * if the node would produce an empty string or if the string cannot be + * allocated. + * + * The callback argument specifies a function that returns a whitespace + * string or NULL before and after each element. If MXML_NO_CALLBACK + * is specified, whitespace will only be added before MXML_TEXT nodes + * with leading whitespace and before attribute names inside opening + * element tags. + */ + +char * /* O - Allocated string or NULL */ +mxmlSaveAllocString( + mxml_node_t *node, /* I - Node to write */ + mxml_save_cb_t cb) /* I - Whitespace callback or MXML_NO_CALLBACK */ +{ + int bytes; /* Required bytes */ + char buffer[8192]; /* Temporary buffer */ + char *s; /* Allocated string */ + + + /* + * Write the node to the temporary buffer... + */ + + bytes = mxmlSaveString(node, buffer, sizeof(buffer), cb); + + if (bytes <= 0) + return (NULL); + + if (bytes < (int)(sizeof(buffer) - 1)) + { + /* + * Node fit inside the buffer, so just duplicate that string and + * return... + */ + + return (strdup(buffer)); + } + + /* + * Allocate a buffer of the required size and save the node to the + * new buffer... + */ + + if ((s = malloc(bytes + 1)) == NULL) + return (NULL); + + mxmlSaveString(node, s, bytes + 1, cb); + + /* + * Return the allocated string... + */ + + return (s); +} + + +/* + * 'mxmlSaveFd()' - Save an XML tree to a file descriptor. + * + * The callback argument specifies a function that returns a whitespace + * string or NULL before and after each element. If MXML_NO_CALLBACK + * is specified, whitespace will only be added before MXML_TEXT nodes + * with leading whitespace and before attribute names inside opening + * element tags. + */ + +int /* O - 0 on success, -1 on error. */ +mxmlSaveFd(mxml_node_t *node, /* I - Node to write */ + int fd, /* I - File descriptor to write to */ + mxml_save_cb_t cb) /* I - Whitespace callback or MXML_NO_CALLBACK */ +{ + int col; /* Final column */ + _mxml_fdbuf_t buf; /* File descriptor buffer */ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + + + /* + * Initialize the file descriptor buffer... + */ + + buf.fd = fd; + buf.current = buf.buffer; + buf.end = buf.buffer + sizeof(buf.buffer); + + /* + * Write the node... + */ + + if ((col = mxml_write_node(node, &buf, cb, 0, mxml_fd_putc, global)) < 0) + return (-1); + + if (col > 0) + if (mxml_fd_putc('\n', &buf) < 0) + return (-1); + + /* + * Flush and return... + */ + + return (mxml_fd_write(&buf)); +} + + +/* + * 'mxmlSaveFile()' - Save an XML tree to a file. + * + * The callback argument specifies a function that returns a whitespace + * string or NULL before and after each element. If MXML_NO_CALLBACK + * is specified, whitespace will only be added before MXML_TEXT nodes + * with leading whitespace and before attribute names inside opening + * element tags. + */ + +int /* O - 0 on success, -1 on error. */ +mxmlSaveFile(mxml_node_t *node, /* I - Node to write */ + FILE *fp, /* I - File to write to */ + mxml_save_cb_t cb) /* I - Whitespace callback or MXML_NO_CALLBACK */ +{ + int col; /* Final column */ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + + + /* + * Write the node... + */ + + if ((col = mxml_write_node(node, fp, cb, 0, mxml_file_putc, global)) < 0) + return (-1); + + if (col > 0) + if (putc('\n', fp) < 0) + return (-1); + + /* + * Return 0 (success)... + */ + + return (0); +} + + +/* + * 'mxmlSaveString()' - Save an XML node tree to a string. + * + * This function returns the total number of bytes that would be + * required for the string but only copies (bufsize - 1) characters + * into the specified buffer. + * + * The callback argument specifies a function that returns a whitespace + * string or NULL before and after each element. If MXML_NO_CALLBACK + * is specified, whitespace will only be added before MXML_TEXT nodes + * with leading whitespace and before attribute names inside opening + * element tags. + */ + +int /* O - Size of string */ +mxmlSaveString(mxml_node_t *node, /* I - Node to write */ + char *buffer, /* I - String buffer */ + int bufsize, /* I - Size of string buffer */ + mxml_save_cb_t cb) /* I - Whitespace callback or MXML_NO_CALLBACK */ +{ + int col; /* Final column */ + char *ptr[3]; /* Pointers for putc_cb */ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + + + /* + * Write the node... + */ + + ptr[0] = buffer; + ptr[1] = buffer + bufsize; + ptr[2] = 0; + + if ((col = mxml_write_node(node, ptr, cb, 0, mxml_string_putc, global)) < 0) + return (-1); + + if (col > 0) + mxml_string_putc('\n', ptr); + + /* + * Nul-terminate the buffer... + */ + + if (ptr[2] != 0) + buffer[bufsize - 1] = '\0'; + else + ptr[0][0] = '\0'; + + /* + * Return the number of characters... + */ + + return (ptr[0] - buffer); +} + + +/* + * 'mxmlSAXLoadFd()' - Load a file descriptor into an XML node tree + * using a SAX callback. + * + * The nodes in the specified file are added to the specified top node. + * If no top node is provided, the XML file MUST be well-formed with a + * single parent node like for the entire file. The callback + * function returns the value type that should be used for child nodes. + * If MXML_NO_CALLBACK is specified then all child nodes will be either + * MXML_ELEMENT or MXML_TEXT nodes. + * + * The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, + * MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading + * child nodes of the specified type. + * + * The SAX callback must call mxmlRetain() for any nodes that need to + * be kept for later use. Otherwise, nodes are deleted when the parent + * node is closed or after each data, comment, CDATA, or directive node. + * + * @since Mini-XML 2.3@ + */ + +mxml_node_t * /* O - First node or NULL if the file could not be read. */ +mxmlSAXLoadFd(mxml_node_t *top, /* I - Top node */ + int fd, /* I - File descriptor to read from */ + mxml_load_cb_t cb, /* I - Callback function or MXML_NO_CALLBACK */ + mxml_sax_cb_t sax_cb, /* I - SAX callback or MXML_NO_CALLBACK */ + void *sax_data) /* I - SAX user data */ +{ + _mxml_fdbuf_t buf; /* File descriptor buffer */ + + + /* + * Initialize the file descriptor buffer... + */ + + buf.fd = fd; + buf.current = buf.buffer; + buf.end = buf.buffer; + + /* + * Read the XML data... + */ + + return (mxml_load_data(top, &buf, cb, mxml_fd_getc, sax_cb, sax_data)); +} + + +/* + * 'mxmlSAXLoadFile()' - Load a file into an XML node tree + * using a SAX callback. + * + * The nodes in the specified file are added to the specified top node. + * If no top node is provided, the XML file MUST be well-formed with a + * single parent node like for the entire file. The callback + * function returns the value type that should be used for child nodes. + * If MXML_NO_CALLBACK is specified then all child nodes will be either + * MXML_ELEMENT or MXML_TEXT nodes. + * + * The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, + * MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading + * child nodes of the specified type. + * + * The SAX callback must call mxmlRetain() for any nodes that need to + * be kept for later use. Otherwise, nodes are deleted when the parent + * node is closed or after each data, comment, CDATA, or directive node. + * + * @since Mini-XML 2.3@ + */ + +mxml_node_t * /* O - First node or NULL if the file could not be read. */ +mxmlSAXLoadFile( + mxml_node_t *top, /* I - Top node */ + FILE *fp, /* I - File to read from */ + mxml_load_cb_t cb, /* I - Callback function or MXML_NO_CALLBACK */ + mxml_sax_cb_t sax_cb, /* I - SAX callback or MXML_NO_CALLBACK */ + void *sax_data) /* I - SAX user data */ +{ + /* + * Read the XML data... + */ + + return (mxml_load_data(top, fp, cb, mxml_file_getc, sax_cb, sax_data)); +} + + +/* + * 'mxmlSAXLoadString()' - Load a string into an XML node tree + * using a SAX callback. + * + * The nodes in the specified string are added to the specified top node. + * If no top node is provided, the XML string MUST be well-formed with a + * single parent node like for the entire string. The callback + * function returns the value type that should be used for child nodes. + * If MXML_NO_CALLBACK is specified then all child nodes will be either + * MXML_ELEMENT or MXML_TEXT nodes. + * + * The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, + * MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading + * child nodes of the specified type. + * + * The SAX callback must call mxmlRetain() for any nodes that need to + * be kept for later use. Otherwise, nodes are deleted when the parent + * node is closed or after each data, comment, CDATA, or directive node. + * + * @since Mini-XML 2.3@ + */ + +mxml_node_t * /* O - First node or NULL if the string has errors. */ +mxmlSAXLoadString( + mxml_node_t *top, /* I - Top node */ + const char *s, /* I - String to load */ + mxml_load_cb_t cb, /* I - Callback function or MXML_NO_CALLBACK */ + mxml_sax_cb_t sax_cb, /* I - SAX callback or MXML_NO_CALLBACK */ + void *sax_data) /* I - SAX user data */ +{ + /* + * Read the XML data... + */ + + return (mxml_load_data(top, (void *)&s, cb, mxml_string_getc, sax_cb, sax_data)); +} + + +/* + * 'mxmlSetCustomHandlers()' - Set the handling functions for custom data. + * + * The load function accepts a node pointer and a data string and must + * return 0 on success and non-zero on error. + * + * The save function accepts a node pointer and must return a malloc'd + * string on success and NULL on error. + * + */ + +void +mxmlSetCustomHandlers( + mxml_custom_load_cb_t load, /* I - Load function */ + mxml_custom_save_cb_t save) /* I - Save function */ +{ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + + + global->custom_load_cb = load; + global->custom_save_cb = save; +} + + +/* + * 'mxmlSetErrorCallback()' - Set the error message callback. + */ + +void +mxmlSetErrorCallback(mxml_error_cb_t cb)/* I - Error callback function */ +{ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + + + global->error_cb = cb; +} + + +/* + * 'mxmlSetWrapMargin()' - Set the wrap margin when saving XML data. + * + * Wrapping is disabled when "column" is 0. + * + * @since Mini-XML 2.3@ + */ + +void +mxmlSetWrapMargin(int column) /* I - Column for wrapping, 0 to disable wrapping */ +{ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + + + global->wrap = column; +} + + +/* + * 'mxml_add_char()' - Add a character to a buffer, expanding as needed. + */ + +static int /* O - 0 on success, -1 on error */ +mxml_add_char(int ch, /* I - Character to add */ + char **bufptr, /* IO - Current position in buffer */ + char **buffer, /* IO - Current buffer */ + int *bufsize) /* IO - Current buffer size */ +{ + char *newbuffer; /* New buffer value */ + + + if (*bufptr >= (*buffer + *bufsize - 4)) + { + /* + * Increase the size of the buffer... + */ + + if (*bufsize < 1024) + (*bufsize) *= 2; + else + (*bufsize) += 1024; + + if ((newbuffer = realloc(*buffer, *bufsize)) == NULL) + { + free(*buffer); + + mxml_error("Unable to expand string buffer to %d bytes!", *bufsize); + + return (-1); + } + + *bufptr = newbuffer + (*bufptr - *buffer); + *buffer = newbuffer; + } + + if (ch < 0x80) + { + /* + * Single byte ASCII... + */ + + *(*bufptr)++ = ch; + } + else if (ch < 0x800) + { + /* + * Two-byte UTF-8... + */ + + *(*bufptr)++ = 0xc0 | (ch >> 6); + *(*bufptr)++ = 0x80 | (ch & 0x3f); + } + else if (ch < 0x10000) + { + /* + * Three-byte UTF-8... + */ + + *(*bufptr)++ = 0xe0 | (ch >> 12); + *(*bufptr)++ = 0x80 | ((ch >> 6) & 0x3f); + *(*bufptr)++ = 0x80 | (ch & 0x3f); + } + else + { + /* + * Four-byte UTF-8... + */ + + *(*bufptr)++ = 0xf0 | (ch >> 18); + *(*bufptr)++ = 0x80 | ((ch >> 12) & 0x3f); + *(*bufptr)++ = 0x80 | ((ch >> 6) & 0x3f); + *(*bufptr)++ = 0x80 | (ch & 0x3f); + } + + return (0); +} + + +/* + * 'mxml_fd_getc()' - Read a character from a file descriptor. + */ + +static int /* O - Character or EOF */ +mxml_fd_getc(void *p, /* I - File descriptor buffer */ + int *encoding) /* IO - Encoding */ +{ + _mxml_fdbuf_t *buf; /* File descriptor buffer */ + int ch, /* Current character */ + temp; /* Temporary character */ + + + /* + * Grab the next character in the buffer... + */ + + buf = (_mxml_fdbuf_t *)p; + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + ch = *(buf->current)++; + + switch (*encoding) + { + case ENCODE_UTF8 : + /* + * Got a UTF-8 character; convert UTF-8 to Unicode and return... + */ + + if (!(ch & 0x80)) + { +#if DEBUG > 1 + printf("mxml_fd_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); +#endif /* DEBUG > 1 */ + + if (mxml_bad_char(ch)) + { + mxml_error("Bad control character 0x%02x not allowed by XML standard!", + ch); + return (EOF); + } + + return (ch); + } + else if (ch == 0xfe) + { + /* + * UTF-16 big-endian BOM? + */ + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + ch = *(buf->current)++; + + if (ch != 0xff) + return (EOF); + + *encoding = ENCODE_UTF16BE; + + return (mxml_fd_getc(p, encoding)); + } + else if (ch == 0xff) + { + /* + * UTF-16 little-endian BOM? + */ + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + ch = *(buf->current)++; + + if (ch != 0xfe) + return (EOF); + + *encoding = ENCODE_UTF16LE; + + return (mxml_fd_getc(p, encoding)); + } + else if ((ch & 0xe0) == 0xc0) + { + /* + * Two-byte value... + */ + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + temp = *(buf->current)++; + + if ((temp & 0xc0) != 0x80) + return (EOF); + + ch = ((ch & 0x1f) << 6) | (temp & 0x3f); + + if (ch < 0x80) + { + mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); + return (EOF); + } + } + else if ((ch & 0xf0) == 0xe0) + { + /* + * Three-byte value... + */ + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + temp = *(buf->current)++; + + if ((temp & 0xc0) != 0x80) + return (EOF); + + ch = ((ch & 0x0f) << 6) | (temp & 0x3f); + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + temp = *(buf->current)++; + + if ((temp & 0xc0) != 0x80) + return (EOF); + + ch = (ch << 6) | (temp & 0x3f); + + if (ch < 0x800) + { + mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); + return (EOF); + } + + /* + * Ignore (strip) Byte Order Mark (BOM)... + */ + + if (ch == 0xfeff) + return (mxml_fd_getc(p, encoding)); + } + else if ((ch & 0xf8) == 0xf0) + { + /* + * Four-byte value... + */ + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + temp = *(buf->current)++; + + if ((temp & 0xc0) != 0x80) + return (EOF); + + ch = ((ch & 0x07) << 6) | (temp & 0x3f); + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + temp = *(buf->current)++; + + if ((temp & 0xc0) != 0x80) + return (EOF); + + ch = (ch << 6) | (temp & 0x3f); + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + temp = *(buf->current)++; + + if ((temp & 0xc0) != 0x80) + return (EOF); + + ch = (ch << 6) | (temp & 0x3f); + + if (ch < 0x10000) + { + mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); + return (EOF); + } + } + else + return (EOF); + break; + + case ENCODE_UTF16BE : + /* + * Read UTF-16 big-endian char... + */ + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + temp = *(buf->current)++; + + ch = (ch << 8) | temp; + + if (mxml_bad_char(ch)) + { + mxml_error("Bad control character 0x%02x not allowed by XML standard!", + ch); + return (EOF); + } + else if (ch >= 0xd800 && ch <= 0xdbff) + { + /* + * Multi-word UTF-16 char... + */ + + int lch; + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + lch = *(buf->current)++; + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + temp = *(buf->current)++; + + lch = (lch << 8) | temp; + + if (lch < 0xdc00 || lch >= 0xdfff) + return (EOF); + + ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; + } + break; + + case ENCODE_UTF16LE : + /* + * Read UTF-16 little-endian char... + */ + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + temp = *(buf->current)++; + + ch |= (temp << 8); + + if (mxml_bad_char(ch)) + { + mxml_error("Bad control character 0x%02x not allowed by XML standard!", + ch); + return (EOF); + } + else if (ch >= 0xd800 && ch <= 0xdbff) + { + /* + * Multi-word UTF-16 char... + */ + + int lch; + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + lch = *(buf->current)++; + + if (buf->current >= buf->end) + if (mxml_fd_read(buf) < 0) + return (EOF); + + temp = *(buf->current)++; + + lch |= (temp << 8); + + if (lch < 0xdc00 || lch >= 0xdfff) + return (EOF); + + ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; + } + break; + } + +#if DEBUG > 1 + printf("mxml_fd_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); +#endif /* DEBUG > 1 */ + + return (ch); +} + + +/* + * 'mxml_fd_putc()' - Write a character to a file descriptor. + */ + +static int /* O - 0 on success, -1 on error */ +mxml_fd_putc(int ch, /* I - Character */ + void *p) /* I - File descriptor buffer */ +{ + _mxml_fdbuf_t *buf; /* File descriptor buffer */ + + + /* + * Flush the write buffer as needed... + */ + + buf = (_mxml_fdbuf_t *)p; + + if (buf->current >= buf->end) + if (mxml_fd_write(buf) < 0) + return (-1); + + *(buf->current)++ = ch; + + /* + * Return successfully... + */ + + return (0); +} + + +/* + * 'mxml_fd_read()' - Read a buffer of data from a file descriptor. + */ + +static int /* O - 0 on success, -1 on error */ +mxml_fd_read(_mxml_fdbuf_t *buf) /* I - File descriptor buffer */ +{ + int bytes; /* Bytes read... */ + + + /* + * Range check input... + */ + + if (!buf) + return (-1); + + /* + * Read from the file descriptor... + */ + + while ((bytes = read(buf->fd, buf->buffer, sizeof(buf->buffer))) < 0) +#ifdef EINTR + if (errno != EAGAIN && errno != EINTR) +#else + if (errno != EAGAIN) +#endif /* EINTR */ + return (-1); + + if (bytes == 0) + return (-1); + + /* + * Update the pointers and return success... + */ + + buf->current = buf->buffer; + buf->end = buf->buffer + bytes; + + return (0); +} + + +/* + * 'mxml_fd_write()' - Write a buffer of data to a file descriptor. + */ + +static int /* O - 0 on success, -1 on error */ +mxml_fd_write(_mxml_fdbuf_t *buf) /* I - File descriptor buffer */ +{ + int bytes; /* Bytes written */ + unsigned char *ptr; /* Pointer into buffer */ + + + /* + * Range check... + */ + + if (!buf) + return (-1); + + /* + * Return 0 if there is nothing to write... + */ + + if (buf->current == buf->buffer) + return (0); + + /* + * Loop until we have written everything... + */ + + for (ptr = buf->buffer; ptr < buf->current; ptr += bytes) + if ((bytes = write(buf->fd, ptr, buf->current - ptr)) < 0) + return (-1); + + /* + * All done, reset pointers and return success... + */ + + buf->current = buf->buffer; + + return (0); +} + + +/* + * 'mxml_file_getc()' - Get a character from a file. + */ + +static int /* O - Character or EOF */ +mxml_file_getc(void *p, /* I - Pointer to file */ + int *encoding) /* IO - Encoding */ +{ + int ch, /* Character from file */ + temp; /* Temporary character */ + FILE *fp; /* Pointer to file */ + + + /* + * Read a character from the file and see if it is EOF or ASCII... + */ + + fp = (FILE *)p; + ch = getc(fp); + + if (ch == EOF) + return (EOF); + + switch (*encoding) + { + case ENCODE_UTF8 : + /* + * Got a UTF-8 character; convert UTF-8 to Unicode and return... + */ + + if (!(ch & 0x80)) + { + if (mxml_bad_char(ch)) + { + mxml_error("Bad control character 0x%02x not allowed by XML standard!", + ch); + return (EOF); + } + +#if DEBUG > 1 + printf("mxml_file_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); +#endif /* DEBUG > 1 */ + + return (ch); + } + else if (ch == 0xfe) + { + /* + * UTF-16 big-endian BOM? + */ + + ch = getc(fp); + if (ch != 0xff) + return (EOF); + + *encoding = ENCODE_UTF16BE; + + return (mxml_file_getc(p, encoding)); + } + else if (ch == 0xff) + { + /* + * UTF-16 little-endian BOM? + */ + + ch = getc(fp); + if (ch != 0xfe) + return (EOF); + + *encoding = ENCODE_UTF16LE; + + return (mxml_file_getc(p, encoding)); + } + else if ((ch & 0xe0) == 0xc0) + { + /* + * Two-byte value... + */ + + if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) + return (EOF); + + ch = ((ch & 0x1f) << 6) | (temp & 0x3f); + + if (ch < 0x80) + { + mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); + return (EOF); + } + } + else if ((ch & 0xf0) == 0xe0) + { + /* + * Three-byte value... + */ + + if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) + return (EOF); + + ch = ((ch & 0x0f) << 6) | (temp & 0x3f); + + if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) + return (EOF); + + ch = (ch << 6) | (temp & 0x3f); + + if (ch < 0x800) + { + mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); + return (EOF); + } + + /* + * Ignore (strip) Byte Order Mark (BOM)... + */ + + if (ch == 0xfeff) + return (mxml_file_getc(p, encoding)); + } + else if ((ch & 0xf8) == 0xf0) + { + /* + * Four-byte value... + */ + + if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) + return (EOF); + + ch = ((ch & 0x07) << 6) | (temp & 0x3f); + + if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) + return (EOF); + + ch = (ch << 6) | (temp & 0x3f); + + if ((temp = getc(fp)) == EOF || (temp & 0xc0) != 0x80) + return (EOF); + + ch = (ch << 6) | (temp & 0x3f); + + if (ch < 0x10000) + { + mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); + return (EOF); + } + } + else + return (EOF); + break; + + case ENCODE_UTF16BE : + /* + * Read UTF-16 big-endian char... + */ + + ch = (ch << 8) | getc(fp); + + if (mxml_bad_char(ch)) + { + mxml_error("Bad control character 0x%02x not allowed by XML standard!", + ch); + return (EOF); + } + else if (ch >= 0xd800 && ch <= 0xdbff) + { + /* + * Multi-word UTF-16 char... + */ + + int lch = getc(fp); + lch = (lch << 8) | getc(fp); + + if (lch < 0xdc00 || lch >= 0xdfff) + return (EOF); + + ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; + } + break; + + case ENCODE_UTF16LE : + /* + * Read UTF-16 little-endian char... + */ + + ch |= (getc(fp) << 8); + + if (mxml_bad_char(ch)) + { + mxml_error("Bad control character 0x%02x not allowed by XML standard!", + ch); + return (EOF); + } + else if (ch >= 0xd800 && ch <= 0xdbff) + { + /* + * Multi-word UTF-16 char... + */ + + int lch = getc(fp); + lch |= (getc(fp) << 8); + + if (lch < 0xdc00 || lch >= 0xdfff) + return (EOF); + + ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; + } + break; + } + +#if DEBUG > 1 + printf("mxml_file_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); +#endif /* DEBUG > 1 */ + + return (ch); +} + + +/* + * 'mxml_file_putc()' - Write a character to a file. + */ + +static int /* O - 0 on success, -1 on failure */ +mxml_file_putc(int ch, /* I - Character to write */ + void *p) /* I - Pointer to file */ +{ + return (putc(ch, (FILE *)p) == EOF ? -1 : 0); +} + + +/* + * 'mxml_get_entity()' - Get the character corresponding to an entity... + */ + +static int /* O - Character value or EOF on error */ +mxml_get_entity(mxml_node_t *parent, /* I - Parent node */ + void *p, /* I - Pointer to source */ + int *encoding, /* IO - Character encoding */ + int (*getc_cb)(void *, int *)) + /* I - Get character function */ +{ + int ch; /* Current character */ + char entity[64], /* Entity string */ + *entptr; /* Pointer into entity */ + + + entptr = entity; + + while ((ch = (*getc_cb)(p, encoding)) != EOF) + if (ch > 126 || (!isalnum(ch) && ch != '#')) + break; + else if (entptr < (entity + sizeof(entity) - 1)) + *entptr++ = ch; + else + { + mxml_error("Entity name too long under parent <%s>!", + parent ? parent->value.element.name : "null"); + break; + } + + *entptr = '\0'; + + if (ch != ';') + { + mxml_error("Character entity \"%s\" not terminated under parent <%s>!", + entity, parent ? parent->value.element.name : "null"); + return (EOF); + } + + if (entity[0] == '#') + { + if (entity[1] == 'x') + ch = strtol(entity + 2, NULL, 16); + else + ch = strtol(entity + 1, NULL, 10); + } + else if ((ch = mxmlEntityGetValue(entity)) < 0) + mxml_error("Entity name \"%s;\" not supported under parent <%s>!", + entity, parent ? parent->value.element.name : "null"); + + if (mxml_bad_char(ch)) + { + mxml_error("Bad control character 0x%02x under parent <%s> not allowed by XML standard!", + ch, parent ? parent->value.element.name : "null"); + return (EOF); + } + + return (ch); +} + + +/* + * 'mxml_load_data()' - Load data into an XML node tree. + */ + +static mxml_node_t * /* O - First node or NULL if the file could not be read. */ +mxml_load_data( + mxml_node_t *top, /* I - Top node */ + void *p, /* I - Pointer to data */ + mxml_load_cb_t cb, /* I - Callback function or MXML_NO_CALLBACK */ + _mxml_getc_cb_t getc_cb, /* I - Read function */ + mxml_sax_cb_t sax_cb, /* I - SAX callback or MXML_NO_CALLBACK */ + void *sax_data) /* I - SAX user data */ +{ + mxml_node_t *node, /* Current node */ + *first, /* First node added */ + *parent; /* Current parent node */ + int ch, /* Character from file */ + whitespace; /* Non-zero if whitespace seen */ + char *buffer, /* String buffer */ + *bufptr; /* Pointer into buffer */ + int bufsize; /* Size of buffer */ + mxml_type_t type; /* Current node type */ + int encoding; /* Character encoding */ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + static const char * const types[] = /* Type strings... */ + { + "MXML_ELEMENT", /* XML element with attributes */ + "MXML_INTEGER", /* Integer value */ + "MXML_OPAQUE", /* Opaque string */ + "MXML_REAL", /* Real value */ + "MXML_TEXT", /* Text fragment */ + "MXML_CUSTOM" /* Custom data */ + }; + + + /* + * Read elements and other nodes from the file... + */ + + if ((buffer = malloc(64)) == NULL) + { + mxml_error("Unable to allocate string buffer!"); + return (NULL); + } + + bufsize = 64; + bufptr = buffer; + parent = top; + first = NULL; + whitespace = 0; + encoding = ENCODE_UTF8; + + if (cb && parent) + type = (*cb)(parent); + else if (parent) + type = MXML_TEXT; + else + type = MXML_IGNORE; + + while ((ch = (*getc_cb)(p, &encoding)) != EOF) + { + if ((ch == '<' || + (mxml_isspace(ch) && type != MXML_OPAQUE && type != MXML_CUSTOM)) && + bufptr > buffer) + { + /* + * Add a new value node... + */ + + *bufptr = '\0'; + + switch (type) + { + case MXML_INTEGER : + node = mxmlNewInteger(parent, strtol(buffer, &bufptr, 0)); + break; + + case MXML_OPAQUE : + node = mxmlNewOpaque(parent, buffer); + break; + + case MXML_REAL : + node = mxmlNewReal(parent, strtod(buffer, &bufptr)); + break; + + case MXML_TEXT : + node = mxmlNewText(parent, whitespace, buffer); + break; + + case MXML_CUSTOM : + if (global->custom_load_cb) + { + /* + * Use the callback to fill in the custom data... + */ + + node = mxmlNewCustom(parent, NULL, NULL); + + if ((*global->custom_load_cb)(node, buffer)) + { + mxml_error("Bad custom value '%s' in parent <%s>!", + buffer, parent ? parent->value.element.name : "null"); + mxmlDelete(node); + node = NULL; + } + break; + } + + default : /* Ignore... */ + node = NULL; + break; + } + + if (*bufptr) + { + /* + * Bad integer/real number value... + */ + + mxml_error("Bad %s value '%s' in parent <%s>!", + type == MXML_INTEGER ? "integer" : "real", buffer, + parent ? parent->value.element.name : "null"); + break; + } + + bufptr = buffer; + whitespace = mxml_isspace(ch) && type == MXML_TEXT; + + if (!node && type != MXML_IGNORE) + { + /* + * Print error and return... + */ + + mxml_error("Unable to add value node of type %s to parent <%s>!", + types[type], parent ? parent->value.element.name : "null"); + goto error; + } + + if (sax_cb) + { + (*sax_cb)(node, MXML_SAX_DATA, sax_data); + + if (!mxmlRelease(node)) + node = NULL; + } + + if (!first && node) + first = node; + } + else if (mxml_isspace(ch) && type == MXML_TEXT) + whitespace = 1; + + /* + * Add lone whitespace node if we have an element and existing + * whitespace... + */ + + if (ch == '<' && whitespace && type == MXML_TEXT) + { + if (parent) + { + node = mxmlNewText(parent, whitespace, ""); + + if (sax_cb) + { + (*sax_cb)(node, MXML_SAX_DATA, sax_data); + + if (!mxmlRelease(node)) + node = NULL; + } + + if (!first && node) + first = node; + } + + whitespace = 0; + } + + if (ch == '<') + { + /* + * Start of open/close tag... + */ + + bufptr = buffer; + + while ((ch = (*getc_cb)(p, &encoding)) != EOF) + if (mxml_isspace(ch) || ch == '>' || (ch == '/' && bufptr > buffer)) + break; + else if (ch == '<') + { + mxml_error("Bare < in element!"); + goto error; + } + else if (ch == '&') + { + if ((ch = mxml_get_entity(parent, p, &encoding, getc_cb)) == EOF) + goto error; + + if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) + goto error; + } + else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) + goto error; + else if (((bufptr - buffer) == 1 && buffer[0] == '?') || + ((bufptr - buffer) == 3 && !strncmp(buffer, "!--", 3)) || + ((bufptr - buffer) == 8 && !strncmp(buffer, "![CDATA[", 8))) + break; + + *bufptr = '\0'; + + if (!strcmp(buffer, "!--")) + { + /* + * Gather rest of comment... + */ + + while ((ch = (*getc_cb)(p, &encoding)) != EOF) + { + if (ch == '>' && bufptr > (buffer + 4) && + bufptr[-3] != '-' && bufptr[-2] == '-' && bufptr[-1] == '-') + break; + else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) + goto error; + } + + /* + * Error out if we didn't get the whole comment... + */ + + if (ch != '>') + { + /* + * Print error and return... + */ + + mxml_error("Early EOF in comment node!"); + goto error; + } + + + /* + * Otherwise add this as an element under the current parent... + */ + + *bufptr = '\0'; + + if (!parent && first) + { + /* + * There can only be one root element! + */ + + mxml_error("<%s> cannot be a second root node after <%s>", + buffer, first->value.element.name); + goto error; + } + + if ((node = mxmlNewElement(parent, buffer)) == NULL) + { + /* + * Just print error for now... + */ + + mxml_error("Unable to add comment node to parent <%s>!", + parent ? parent->value.element.name : "null"); + break; + } + + if (sax_cb) + { + (*sax_cb)(node, MXML_SAX_COMMENT, sax_data); + + if (!mxmlRelease(node)) + node = NULL; + } + + if (node && !first) + first = node; + } + else if (!strcmp(buffer, "![CDATA[")) + { + /* + * Gather CDATA section... + */ + + while ((ch = (*getc_cb)(p, &encoding)) != EOF) + { + if (ch == '>' && !strncmp(bufptr - 2, "]]", 2)) + break; + else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) + goto error; + } + + /* + * Error out if we didn't get the whole comment... + */ + + if (ch != '>') + { + /* + * Print error and return... + */ + + mxml_error("Early EOF in CDATA node!"); + goto error; + } + + + /* + * Otherwise add this as an element under the current parent... + */ + + *bufptr = '\0'; + + if (!parent && first) + { + /* + * There can only be one root element! + */ + + mxml_error("<%s> cannot be a second root node after <%s>", + buffer, first->value.element.name); + goto error; + } + + if ((node = mxmlNewElement(parent, buffer)) == NULL) + { + /* + * Print error and return... + */ + + mxml_error("Unable to add CDATA node to parent <%s>!", + parent ? parent->value.element.name : "null"); + goto error; + } + + if (sax_cb) + { + (*sax_cb)(node, MXML_SAX_CDATA, sax_data); + + if (!mxmlRelease(node)) + node = NULL; + } + + if (node && !first) + first = node; + } + else if (buffer[0] == '?') + { + /* + * Gather rest of processing instruction... + */ + + while ((ch = (*getc_cb)(p, &encoding)) != EOF) + { + if (ch == '>' && bufptr > buffer && bufptr[-1] == '?') + break; + else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) + goto error; + } + + /* + * Error out if we didn't get the whole processing instruction... + */ + + if (ch != '>') + { + /* + * Print error and return... + */ + + mxml_error("Early EOF in processing instruction node!"); + goto error; + } + + /* + * Otherwise add this as an element under the current parent... + */ + + *bufptr = '\0'; + + if (!parent && first) + { + /* + * There can only be one root element! + */ + + mxml_error("<%s> cannot be a second root node after <%s>", + buffer, first->value.element.name); + goto error; + } + + if ((node = mxmlNewElement(parent, buffer)) == NULL) + { + /* + * Print error and return... + */ + + mxml_error("Unable to add processing instruction node to parent <%s>!", + parent ? parent->value.element.name : "null"); + goto error; + } + + if (sax_cb) + { + (*sax_cb)(node, MXML_SAX_DIRECTIVE, sax_data); + + if (!mxmlRelease(node)) + node = NULL; + } + + if (node) + { + if (!first) + first = node; + + if (!parent) + { + parent = node; + + if (cb) + type = (*cb)(parent); + } + } + } + else if (buffer[0] == '!') + { + /* + * Gather rest of declaration... + */ + + do + { + if (ch == '>') + break; + else + { + if (ch == '&') + if ((ch = mxml_get_entity(parent, p, &encoding, getc_cb)) == EOF) + goto error; + + if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) + goto error; + } + } + while ((ch = (*getc_cb)(p, &encoding)) != EOF); + + /* + * Error out if we didn't get the whole declaration... + */ + + if (ch != '>') + { + /* + * Print error and return... + */ + + mxml_error("Early EOF in declaration node!"); + goto error; + } + + /* + * Otherwise add this as an element under the current parent... + */ + + *bufptr = '\0'; + + if (!parent && first) + { + /* + * There can only be one root element! + */ + + mxml_error("<%s> cannot be a second root node after <%s>", + buffer, first->value.element.name); + goto error; + } + + if ((node = mxmlNewElement(parent, buffer)) == NULL) + { + /* + * Print error and return... + */ + + mxml_error("Unable to add declaration node to parent <%s>!", + parent ? parent->value.element.name : "null"); + goto error; + } + + if (sax_cb) + { + (*sax_cb)(node, MXML_SAX_DIRECTIVE, sax_data); + + if (!mxmlRelease(node)) + node = NULL; + } + + if (node) + { + if (!first) + first = node; + + if (!parent) + { + parent = node; + + if (cb) + type = (*cb)(parent); + } + } + } + else if (buffer[0] == '/') + { + /* + * Handle close tag... + */ + + if (!parent || strcmp(buffer + 1, parent->value.element.name)) + { + /* + * Close tag doesn't match tree; print an error for now... + */ + + mxml_error("Mismatched close tag <%s> under parent <%s>!", + buffer, parent ? parent->value.element.name : "(null)"); + goto error; + } + + /* + * Keep reading until we see >... + */ + + while (ch != '>' && ch != EOF) + ch = (*getc_cb)(p, &encoding); + + node = parent; + parent = parent->parent; + + if (sax_cb) + { + (*sax_cb)(node, MXML_SAX_ELEMENT_CLOSE, sax_data); + + if (!mxmlRelease(node) && first == node) + first = NULL; + } + + /* + * Ascend into the parent and set the value type as needed... + */ + + if (cb && parent) + type = (*cb)(parent); + } + else + { + /* + * Handle open tag... + */ + + if (!parent && first) + { + /* + * There can only be one root element! + */ + + mxml_error("<%s> cannot be a second root node after <%s>", + buffer, first->value.element.name); + goto error; + } + + if ((node = mxmlNewElement(parent, buffer)) == NULL) + { + /* + * Just print error for now... + */ + + mxml_error("Unable to add element node to parent <%s>!", + parent ? parent->value.element.name : "null"); + goto error; + } + + if (mxml_isspace(ch)) + { + if ((ch = mxml_parse_element(node, p, &encoding, getc_cb)) == EOF) + goto error; + } + else if (ch == '/') + { + if ((ch = (*getc_cb)(p, &encoding)) != '>') + { + mxml_error("Expected > but got '%c' instead for element <%s/>!", + ch, buffer); + mxmlDelete(node); + goto error; + } + + ch = '/'; + } + + if (sax_cb) + (*sax_cb)(node, MXML_SAX_ELEMENT_OPEN, sax_data); + + if (!first) + first = node; + + if (ch == EOF) + break; + + if (ch != '/') + { + /* + * Descend into this node, setting the value type as needed... + */ + + parent = node; + + if (cb && parent) + type = (*cb)(parent); + } + else if (sax_cb) + { + (*sax_cb)(node, MXML_SAX_ELEMENT_CLOSE, sax_data); + + if (!mxmlRelease(node) && first == node) + first = NULL; + } + } + + bufptr = buffer; + } + else if (ch == '&') + { + /* + * Add character entity to current buffer... + */ + + if ((ch = mxml_get_entity(parent, p, &encoding, getc_cb)) == EOF) + goto error; + + if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) + goto error; + } + else if (type == MXML_OPAQUE || type == MXML_CUSTOM || !mxml_isspace(ch)) + { + /* + * Add character to current buffer... + */ + + if (mxml_add_char(ch, &bufptr, &buffer, &bufsize)) + goto error; + } + } + + /* + * Free the string buffer - we don't need it anymore... + */ + + free(buffer); + + /* + * Find the top element and return it... + */ + + if (parent) + { + node = parent; + + while (parent != top && parent->parent) + parent = parent->parent; + + if (node != parent) + { + mxml_error("Missing close tag under parent <%s>!", + node->value.element.name, + node->parent ? node->parent->value.element.name : "(null)"); + + mxmlDelete(first); + + return (NULL); + } + } + + if (parent) + return (parent); + else + return (first); + + /* + * Common error return... + */ + +error: + + mxmlDelete(first); + + free(buffer); + + return (NULL); +} + + +/* + * 'mxml_parse_element()' - Parse an element for any attributes... + */ + +static int /* O - Terminating character */ +mxml_parse_element( + mxml_node_t *node, /* I - Element node */ + void *p, /* I - Data to read from */ + int *encoding, /* IO - Encoding */ + _mxml_getc_cb_t getc_cb) /* I - Data callback */ +{ + int ch, /* Current character in file */ + quote; /* Quoting character */ + char *name, /* Attribute name */ + *value, /* Attribute value */ + *ptr; /* Pointer into name/value */ + int namesize, /* Size of name string */ + valsize; /* Size of value string */ + + + /* + * Initialize the name and value buffers... + */ + + if ((name = malloc(64)) == NULL) + { + mxml_error("Unable to allocate memory for name!"); + return (EOF); + } + + namesize = 64; + + if ((value = malloc(64)) == NULL) + { + free(name); + mxml_error("Unable to allocate memory for value!"); + return (EOF); + } + + valsize = 64; + + /* + * Loop until we hit a >, /, ?, or EOF... + */ + + while ((ch = (*getc_cb)(p, encoding)) != EOF) + { +#if DEBUG > 1 + fprintf(stderr, "parse_element: ch='%c'\n", ch); +#endif /* DEBUG > 1 */ + + /* + * Skip leading whitespace... + */ + + if (mxml_isspace(ch)) + continue; + + /* + * Stop at /, ?, or >... + */ + + if (ch == '/' || ch == '?') + { + /* + * Grab the > character and print an error if it isn't there... + */ + + quote = (*getc_cb)(p, encoding); + + if (quote != '>') + { + mxml_error("Expected '>' after '%c' for element %s, but got '%c'!", + ch, node->value.element.name, quote); + goto error; + } + + break; + } + else if (ch == '<') + { + mxml_error("Bare < in element %s!", node->value.element.name); + goto error; + } + else if (ch == '>') + break; + + /* + * Read the attribute name... + */ + + name[0] = ch; + ptr = name + 1; + + if (ch == '\"' || ch == '\'') + { + /* + * Name is in quotes, so get a quoted string... + */ + + quote = ch; + + while ((ch = (*getc_cb)(p, encoding)) != EOF) + { + if (ch == '&') + if ((ch = mxml_get_entity(node, p, encoding, getc_cb)) == EOF) + goto error; + + if (mxml_add_char(ch, &ptr, &name, &namesize)) + goto error; + + if (ch == quote) + break; + } + } + else + { + /* + * Grab an normal, non-quoted name... + */ + + while ((ch = (*getc_cb)(p, encoding)) != EOF) + if (mxml_isspace(ch) || ch == '=' || ch == '/' || ch == '>' || + ch == '?') + break; + else + { + if (ch == '&') + if ((ch = mxml_get_entity(node, p, encoding, getc_cb)) == EOF) + goto error; + + if (mxml_add_char(ch, &ptr, &name, &namesize)) + goto error; + } + } + + *ptr = '\0'; + + if (mxmlElementGetAttr(node, name)) + goto error; + + while (ch != EOF && mxml_isspace(ch)) + ch = (*getc_cb)(p, encoding); + + if (ch == '=') + { + /* + * Read the attribute value... + */ + + while ((ch = (*getc_cb)(p, encoding)) != EOF && mxml_isspace(ch)); + + if (ch == EOF) + { + mxml_error("Missing value for attribute '%s' in element %s!", + name, node->value.element.name); + goto error; + } + + if (ch == '\'' || ch == '\"') + { + /* + * Read quoted value... + */ + + quote = ch; + ptr = value; + + while ((ch = (*getc_cb)(p, encoding)) != EOF) + if (ch == quote) + break; + else + { + if (ch == '&') + if ((ch = mxml_get_entity(node, p, encoding, getc_cb)) == EOF) + goto error; + + if (mxml_add_char(ch, &ptr, &value, &valsize)) + goto error; + } + + *ptr = '\0'; + } + else + { + /* + * Read unquoted value... + */ + + value[0] = ch; + ptr = value + 1; + + while ((ch = (*getc_cb)(p, encoding)) != EOF) + if (mxml_isspace(ch) || ch == '=' || ch == '/' || ch == '>') + break; + else + { + if (ch == '&') + if ((ch = mxml_get_entity(node, p, encoding, getc_cb)) == EOF) + goto error; + + if (mxml_add_char(ch, &ptr, &value, &valsize)) + goto error; + } + + *ptr = '\0'; + } + + /* + * Set the attribute with the given string value... + */ + + mxmlElementSetAttr(node, name, value); + } + else + { + mxml_error("Missing value for attribute '%s' in element %s!", + name, node->value.element.name); + goto error; + } + + /* + * Check the end character... + */ + + if (ch == '/' || ch == '?') + { + /* + * Grab the > character and print an error if it isn't there... + */ + + quote = (*getc_cb)(p, encoding); + + if (quote != '>') + { + mxml_error("Expected '>' after '%c' for element %s, but got '%c'!", + ch, node->value.element.name, quote); + ch = EOF; + } + + break; + } + else if (ch == '>') + break; + } + + /* + * Free the name and value buffers and return... + */ + + free(name); + free(value); + + return (ch); + + /* + * Common error return point... + */ + +error: + + free(name); + free(value); + + return (EOF); +} + + +/* + * 'mxml_string_getc()' - Get a character from a string. + */ + +static int /* O - Character or EOF */ +mxml_string_getc(void *p, /* I - Pointer to file */ + int *encoding) /* IO - Encoding */ +{ + int ch; /* Character */ + const char **s; /* Pointer to string pointer */ + + + s = (const char **)p; + + if ((ch = (*s)[0] & 255) != 0 || *encoding == ENCODE_UTF16LE) + { + /* + * Got character; convert UTF-8 to integer and return... + */ + + (*s)++; + + switch (*encoding) + { + case ENCODE_UTF8 : + if (!(ch & 0x80)) + { +#if DEBUG > 1 + printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); +#endif /* DEBUG > 1 */ + + if (mxml_bad_char(ch)) + { + mxml_error("Bad control character 0x%02x not allowed by XML standard!", + ch); + return (EOF); + } + + return (ch); + } + else if (ch == 0xfe) + { + /* + * UTF-16 big-endian BOM? + */ + + if (((*s)[0] & 255) != 0xff) + return (EOF); + + *encoding = ENCODE_UTF16BE; + (*s)++; + + return (mxml_string_getc(p, encoding)); + } + else if (ch == 0xff) + { + /* + * UTF-16 little-endian BOM? + */ + + if (((*s)[0] & 255) != 0xfe) + return (EOF); + + *encoding = ENCODE_UTF16LE; + (*s)++; + + return (mxml_string_getc(p, encoding)); + } + else if ((ch & 0xe0) == 0xc0) + { + /* + * Two-byte value... + */ + + if (((*s)[0] & 0xc0) != 0x80) + return (EOF); + + ch = ((ch & 0x1f) << 6) | ((*s)[0] & 0x3f); + + (*s)++; + + if (ch < 0x80) + { + mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); + return (EOF); + } + +#if DEBUG > 1 + printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); +#endif /* DEBUG > 1 */ + + return (ch); + } + else if ((ch & 0xf0) == 0xe0) + { + /* + * Three-byte value... + */ + + if (((*s)[0] & 0xc0) != 0x80 || + ((*s)[1] & 0xc0) != 0x80) + return (EOF); + + ch = ((((ch & 0x0f) << 6) | ((*s)[0] & 0x3f)) << 6) | ((*s)[1] & 0x3f); + + (*s) += 2; + + if (ch < 0x800) + { + mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); + return (EOF); + } + + /* + * Ignore (strip) Byte Order Mark (BOM)... + */ + + if (ch == 0xfeff) + return (mxml_string_getc(p, encoding)); + +#if DEBUG > 1 + printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); +#endif /* DEBUG > 1 */ + + return (ch); + } + else if ((ch & 0xf8) == 0xf0) + { + /* + * Four-byte value... + */ + + if (((*s)[0] & 0xc0) != 0x80 || + ((*s)[1] & 0xc0) != 0x80 || + ((*s)[2] & 0xc0) != 0x80) + return (EOF); + + ch = ((((((ch & 0x07) << 6) | ((*s)[0] & 0x3f)) << 6) | + ((*s)[1] & 0x3f)) << 6) | ((*s)[2] & 0x3f); + + (*s) += 3; + + if (ch < 0x10000) + { + mxml_error("Invalid UTF-8 sequence for character 0x%04x!", ch); + return (EOF); + } + +#if DEBUG > 1 + printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); +#endif /* DEBUG > 1 */ + + return (ch); + } + else + return (EOF); + + case ENCODE_UTF16BE : + /* + * Read UTF-16 big-endian char... + */ + + ch = (ch << 8) | ((*s)[0] & 255); + (*s) ++; + + if (mxml_bad_char(ch)) + { + mxml_error("Bad control character 0x%02x not allowed by XML standard!", + ch); + return (EOF); + } + else if (ch >= 0xd800 && ch <= 0xdbff) + { + /* + * Multi-word UTF-16 char... + */ + + int lch; /* Lower word */ + + + if (!(*s)[0]) + return (EOF); + + lch = (((*s)[0] & 255) << 8) | ((*s)[1] & 255); + (*s) += 2; + + if (lch < 0xdc00 || lch >= 0xdfff) + return (EOF); + + ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; + } + +#if DEBUG > 1 + printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); +#endif /* DEBUG > 1 */ + + return (ch); + + case ENCODE_UTF16LE : + /* + * Read UTF-16 little-endian char... + */ + + ch = ch | (((*s)[0] & 255) << 8); + + if (!ch) + { + (*s) --; + return (EOF); + } + + (*s) ++; + + if (mxml_bad_char(ch)) + { + mxml_error("Bad control character 0x%02x not allowed by XML standard!", + ch); + return (EOF); + } + else if (ch >= 0xd800 && ch <= 0xdbff) + { + /* + * Multi-word UTF-16 char... + */ + + int lch; /* Lower word */ + + + if (!(*s)[1]) + return (EOF); + + lch = (((*s)[1] & 255) << 8) | ((*s)[0] & 255); + (*s) += 2; + + if (lch < 0xdc00 || lch >= 0xdfff) + return (EOF); + + ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; + } + +#if DEBUG > 1 + printf("mxml_string_getc: %c (0x%04x)\n", ch < ' ' ? '.' : ch, ch); +#endif /* DEBUG > 1 */ + + return (ch); + } + } + + return (EOF); +} + + +/* + * 'mxml_string_putc()' - Write a character to a string. + */ + +static int /* O - 0 on success, -1 on failure */ +mxml_string_putc(int ch, /* I - Character to write */ + void *p) /* I - Pointer to string pointers */ +{ + char **pp; /* Pointer to string pointers */ + + + pp = (char **)p; + + if (pp[2] == 0) { + if (pp[0] < pp[1]) + pp[0][0] = ch; + else + pp[2] = (char *)1; + } + + pp[0] ++; + + return (0); +} + + +/* + * 'mxml_write_name()' - Write a name string. + */ + +static int /* O - 0 on success, -1 on failure */ +mxml_write_name(const char *s, /* I - Name to write */ + void *p, /* I - Write pointer */ + int (*putc_cb)(int, void *)) + /* I - Write callback */ +{ + char quote; /* Quote character */ + const char *name; /* Entity name */ + + + if (*s == '\"' || *s == '\'') + { + /* + * Write a quoted name string... + */ + + if ((*putc_cb)(*s, p) < 0) + return (-1); + + quote = *s++; + + while (*s && *s != quote) + { + if ((name = mxmlEntityGetName(*s)) != NULL) + { + if ((*putc_cb)('&', p) < 0) + return (-1); + + while (*name) + { + if ((*putc_cb)(*name, p) < 0) + return (-1); + + name ++; + } + + if ((*putc_cb)(';', p) < 0) + return (-1); + } + else if ((*putc_cb)(*s, p) < 0) + return (-1); + + s ++; + } + + /* + * Write the end quote... + */ + + if ((*putc_cb)(quote, p) < 0) + return (-1); + } + else + { + /* + * Write a non-quoted name string... + */ + + while (*s) + { + if ((*putc_cb)(*s, p) < 0) + return (-1); + + s ++; + } + } + + return (0); +} + + +/* + * 'mxml_write_node()' - Save an XML node to a file. + */ + +static int /* O - Column or -1 on error */ +mxml_write_node(mxml_node_t *node, /* I - Node to write */ + void *p, /* I - File to write to */ + mxml_save_cb_t cb, /* I - Whitespace callback */ + int col, /* I - Current column */ + _mxml_putc_cb_t putc_cb,/* I - Output callback */ + _mxml_global_t *global)/* I - Global data */ +{ + int i, /* Looping var */ + width; /* Width of attr + value */ + mxml_attr_t *attr; /* Current attribute */ + char s[255]; /* Temporary string */ + + + /* + * Print the node value... + */ + + switch (node->type) + { + case MXML_ELEMENT : + col = mxml_write_ws(node, p, cb, MXML_WS_BEFORE_OPEN, col, putc_cb); + + if ((*putc_cb)('<', p) < 0) + return (-1); + if (node->value.element.name[0] == '?' || + !strncmp(node->value.element.name, "!--", 3) || + !strncmp(node->value.element.name, "![CDATA[", 8)) + { + /* + * Comments, CDATA, and processing instructions do not + * use character entities. + */ + + const char *ptr; /* Pointer into name */ + + + for (ptr = node->value.element.name; *ptr; ptr ++) + if ((*putc_cb)(*ptr, p) < 0) + return (-1); + } + else if (mxml_write_name(node->value.element.name, p, putc_cb) < 0) + return (-1); + + col += strlen(node->value.element.name) + 1; + + for (i = node->value.element.num_attrs, attr = node->value.element.attrs; + i > 0; + i --, attr ++) + { + width = strlen(attr->name); + + if (attr->value) + width += strlen(attr->value) + 3; + + if (global->wrap > 0 && (col + width) > global->wrap) + { + if ((*putc_cb)('\n', p) < 0) + return (-1); + + col = 0; + } + else + { + if ((*putc_cb)(' ', p) < 0) + return (-1); + + col ++; + } + + if (mxml_write_name(attr->name, p, putc_cb) < 0) + return (-1); + + if (attr->value) + { + if ((*putc_cb)('=', p) < 0) + return (-1); + if ((*putc_cb)('\"', p) < 0) + return (-1); + if (mxml_write_string(attr->value, p, putc_cb) < 0) + return (-1); + if ((*putc_cb)('\"', p) < 0) + return (-1); + } + + col += width; + } + + if (node->child) + { + /* + * Write children... + */ + + mxml_node_t *child; /* Current child */ + + + if ((*putc_cb)('>', p) < 0) + return (-1); + else + col ++; + + col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb); + + for (child = node->child; child; child = child->next) + { + if ((col = mxml_write_node(child, p, cb, col, putc_cb, global)) < 0) + return (-1); + } + + /* + * The ? and ! elements are special-cases and have no end tags... + */ + + if (node->value.element.name[0] != '!' && + node->value.element.name[0] != '?') + { + col = mxml_write_ws(node, p, cb, MXML_WS_BEFORE_CLOSE, col, putc_cb); + + if ((*putc_cb)('<', p) < 0) + return (-1); + if ((*putc_cb)('/', p) < 0) + return (-1); + if (mxml_write_string(node->value.element.name, p, putc_cb) < 0) + return (-1); + if ((*putc_cb)('>', p) < 0) + return (-1); + + col += strlen(node->value.element.name) + 3; + + col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_CLOSE, col, putc_cb); + } + } + else if (node->value.element.name[0] == '!' || + node->value.element.name[0] == '?') + { + /* + * The ? and ! elements are special-cases... + */ + + if ((*putc_cb)('>', p) < 0) + return (-1); + else + col ++; + + col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb); + } + else + { + if ((*putc_cb)(' ', p) < 0) + return (-1); + if ((*putc_cb)('/', p) < 0) + return (-1); + if ((*putc_cb)('>', p) < 0) + return (-1); + + col += 3; + + col = mxml_write_ws(node, p, cb, MXML_WS_AFTER_OPEN, col, putc_cb); + } + break; + + case MXML_INTEGER : + if (node->prev) + { + if (global->wrap > 0 && col > global->wrap) + { + if ((*putc_cb)('\n', p) < 0) + return (-1); + + col = 0; + } + else if ((*putc_cb)(' ', p) < 0) + return (-1); + else + col ++; + } + + sprintf(s, "%d", node->value.integer); + if (mxml_write_string(s, p, putc_cb) < 0) + return (-1); + + col += strlen(s); + break; + + case MXML_OPAQUE : + if (mxml_write_string(node->value.opaque, p, putc_cb) < 0) + return (-1); + + col += strlen(node->value.opaque); + break; + + case MXML_REAL : + if (node->prev) + { + if (global->wrap > 0 && col > global->wrap) + { + if ((*putc_cb)('\n', p) < 0) + return (-1); + + col = 0; + } + else if ((*putc_cb)(' ', p) < 0) + return (-1); + else + col ++; + } + + sprintf(s, "%f", node->value.real); + if (mxml_write_string(s, p, putc_cb) < 0) + return (-1); + + col += strlen(s); + break; + + case MXML_TEXT : + if (node->value.text.whitespace && col > 0) + { + if (global->wrap > 0 && col > global->wrap) + { + if ((*putc_cb)('\n', p) < 0) + return (-1); + + col = 0; + } + else if ((*putc_cb)(' ', p) < 0) + return (-1); + else + col ++; + } + + if (mxml_write_string(node->value.text.string, p, putc_cb) < 0) + return (-1); + + col += strlen(node->value.text.string); + break; + + case MXML_CUSTOM : + if (global->custom_save_cb) + { + char *data; /* Custom data string */ + const char *newline; /* Last newline in string */ + + + if ((data = (*global->custom_save_cb)(node)) == NULL) + return (-1); + + if (mxml_write_string(data, p, putc_cb) < 0) + return (-1); + + if ((newline = strrchr(data, '\n')) == NULL) + col += strlen(data); + else + col = strlen(newline); + + free(data); + break; + } + + default : /* Should never happen */ + return (-1); + } + + return (col); +} + + +/* + * 'mxml_write_string()' - Write a string, escaping & and < as needed. + */ + +static int /* O - 0 on success, -1 on failure */ +mxml_write_string( + const char *s, /* I - String to write */ + void *p, /* I - Write pointer */ + _mxml_putc_cb_t putc_cb) /* I - Write callback */ +{ + const char *name; /* Entity name, if any */ + + + while (*s) + { + if ((name = mxmlEntityGetName(*s)) != NULL) + { + if ((*putc_cb)('&', p) < 0) + return (-1); + + while (*name) + { + if ((*putc_cb)(*name, p) < 0) + return (-1); + name ++; + } + + if ((*putc_cb)(';', p) < 0) + return (-1); + } + else if ((*putc_cb)(*s, p) < 0) + return (-1); + + s ++; + } + + return (0); +} + + +/* + * 'mxml_write_ws()' - Do whitespace callback... + */ + +static int /* O - New column */ +mxml_write_ws(mxml_node_t *node, /* I - Current node */ + void *p, /* I - Write pointer */ + mxml_save_cb_t cb, /* I - Callback function */ + int ws, /* I - Where value */ + int col, /* I - Current column */ + _mxml_putc_cb_t putc_cb) /* I - Write callback */ +{ + const char *s; /* Whitespace string */ + + + if (cb && (s = (*cb)(node, ws)) != NULL) + { + while (*s) + { + if ((*putc_cb)(*s, p) < 0) + return (-1); + else if (*s == '\n') + col = 0; + else if (*s == '\t') + { + col += MXML_TAB; + col = col - (col % MXML_TAB); + } + else + col ++; + + s ++; + } + } + + return (col); +} + + +/* + * End of "$Id: mxml-file.c 455 2014-01-05 03:28:03Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-get.c b/tools/gator/daemon/mxml/mxml-get.c new file mode 100644 index 00000000..40ed3d08 --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-get.c @@ -0,0 +1,452 @@ +/* + * "$Id: mxml-get.c 451 2014-01-04 21:50:06Z msweet $" + * + * Node get functions for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include "config.h" +#include "mxml.h" + + +/* + * 'mxmlGetCDATA()' - Get the value for a CDATA node. + * + * @code NULL@ is returned if the node is not a CDATA element. + * + * @since Mini-XML 2.7@ + */ + +const char * /* O - CDATA value or NULL */ +mxmlGetCDATA(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node || node->type != MXML_ELEMENT || + strncmp(node->value.element.name, "![CDATA[", 8)) + return (NULL); + + /* + * Return the text following the CDATA declaration... + */ + + return (node->value.element.name + 8); +} + + +/* + * 'mxmlGetCustom()' - Get the value for a custom node. + * + * @code NULL@ is returned if the node (or its first child) is not a custom + * value node. + * + * @since Mini-XML 2.7@ + */ + +const void * /* O - Custom value or NULL */ +mxmlGetCustom(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node) + return (NULL); + + /* + * Return the integer value... + */ + + if (node->type == MXML_CUSTOM) + return (node->value.custom.data); + else if (node->type == MXML_ELEMENT && + node->child && + node->child->type == MXML_CUSTOM) + return (node->child->value.custom.data); + else + return (NULL); +} + + +/* + * 'mxmlGetElement()' - Get the name for an element node. + * + * @code NULL@ is returned if the node is not an element node. + * + * @since Mini-XML 2.7@ + */ + +const char * /* O - Element name or NULL */ +mxmlGetElement(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node || node->type != MXML_ELEMENT) + return (NULL); + + /* + * Return the element name... + */ + + return (node->value.element.name); +} + + +/* + * 'mxmlGetFirstChild()' - Get the first child of an element node. + * + * @code NULL@ is returned if the node is not an element node or if the node + * has no children. + * + * @since Mini-XML 2.7@ + */ + +mxml_node_t * /* O - First child or NULL */ +mxmlGetFirstChild(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node || node->type != MXML_ELEMENT) + return (NULL); + + /* + * Return the first child node... + */ + + return (node->child); +} + + +/* + * 'mxmlGetInteger()' - Get the integer value from the specified node or its + * first child. + * + * 0 is returned if the node (or its first child) is not an integer value node. + * + * @since Mini-XML 2.7@ + */ + +int /* O - Integer value or 0 */ +mxmlGetInteger(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node) + return (0); + + /* + * Return the integer value... + */ + + if (node->type == MXML_INTEGER) + return (node->value.integer); + else if (node->type == MXML_ELEMENT && + node->child && + node->child->type == MXML_INTEGER) + return (node->child->value.integer); + else + return (0); +} + + +/* + * 'mxmlGetLastChild()' - Get the last child of an element node. + * + * @code NULL@ is returned if the node is not an element node or if the node + * has no children. + * + * @since Mini-XML 2.7@ + */ + +mxml_node_t * /* O - Last child or NULL */ +mxmlGetLastChild(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node || node->type != MXML_ELEMENT) + return (NULL); + + /* + * Return the node type... + */ + + return (node->last_child); +} + + +/* + * 'mxmlGetNextSibling()' - Get the next node for the current parent. + * + * @code NULL@ is returned if this is the last child for the current parent. + * + * @since Mini-XML 2.7@ + */ + +mxml_node_t * +mxmlGetNextSibling(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node) + return (NULL); + + /* + * Return the node type... + */ + + return (node->next); +} + + +/* + * 'mxmlGetOpaque()' - Get an opaque string value for a node or its first child. + * + * @code NULL@ is returned if the node (or its first child) is not an opaque + * value node. + * + * @since Mini-XML 2.7@ + */ + +const char * /* O - Opaque string or NULL */ +mxmlGetOpaque(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node) + return (NULL); + + /* + * Return the integer value... + */ + + if (node->type == MXML_OPAQUE) + return (node->value.opaque); + else if (node->type == MXML_ELEMENT && + node->child && + node->child->type == MXML_OPAQUE) + return (node->child->value.opaque); + else + return (NULL); +} + + +/* + * 'mxmlGetParent()' - Get the parent node. + * + * @code NULL@ is returned for a root node. + * + * @since Mini-XML 2.7@ + */ + +mxml_node_t * /* O - Parent node or NULL */ +mxmlGetParent(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node) + return (NULL); + + /* + * Return the node type... + */ + + return (node->parent); +} + + +/* + * 'mxmlGetPrevSibling()' - Get the previous node for the current parent. + * + * @code NULL@ is returned if this is the first child for the current parent. + * + * @since Mini-XML 2.7@ + */ + +mxml_node_t * /* O - Previous node or NULL */ +mxmlGetPrevSibling(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node) + return (NULL); + + /* + * Return the node type... + */ + + return (node->prev); +} + + +/* + * 'mxmlGetReal()' - Get the real value for a node or its first child. + * + * 0.0 is returned if the node (or its first child) is not a real value node. + * + * @since Mini-XML 2.7@ + */ + +double /* O - Real value or 0.0 */ +mxmlGetReal(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node) + return (0.0); + + /* + * Return the integer value... + */ + + if (node->type == MXML_REAL) + return (node->value.real); + else if (node->type == MXML_ELEMENT && + node->child && + node->child->type == MXML_REAL) + return (node->child->value.real); + else + return (0.0); +} + + +/* + * 'mxmlGetText()' - Get the text value for a node or its first child. + * + * @code NULL@ is returned if the node (or its first child) is not a text node. + * The "whitespace" argument can be NULL. + * + * @since Mini-XML 2.7@ + */ + +const char * /* O - Text string or NULL */ +mxmlGetText(mxml_node_t *node, /* I - Node to get */ + int *whitespace) /* O - 1 if string is preceded by whitespace, 0 otherwise */ +{ + /* + * Range check input... + */ + + if (!node) + { + if (whitespace) + *whitespace = 0; + + return (NULL); + } + + /* + * Return the integer value... + */ + + if (node->type == MXML_TEXT) + { + if (whitespace) + *whitespace = node->value.text.whitespace; + + return (node->value.text.string); + } + else if (node->type == MXML_ELEMENT && + node->child && + node->child->type == MXML_TEXT) + { + if (whitespace) + *whitespace = node->child->value.text.whitespace; + + return (node->child->value.text.string); + } + else + { + if (whitespace) + *whitespace = 0; + + return (NULL); + } +} + + +/* + * 'mxmlGetType()' - Get the node type. + * + * @code MXML_IGNORE@ is returned if "node" is @code NULL@. + * + * @since Mini-XML 2.7@ + */ + +mxml_type_t /* O - Type of node */ +mxmlGetType(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node) + return (MXML_IGNORE); + + /* + * Return the node type... + */ + + return (node->type); +} + + +/* + * 'mxmlGetUserData()' - Get the user data pointer for a node. + * + * @since Mini-XML 2.7@ + */ + +void * /* O - User data pointer */ +mxmlGetUserData(mxml_node_t *node) /* I - Node to get */ +{ + /* + * Range check input... + */ + + if (!node) + return (NULL); + + /* + * Return the user data pointer... + */ + + return (node->user_data); +} + + +/* + * End of "$Id: mxml-get.c 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-index.c b/tools/gator/daemon/mxml/mxml-index.c new file mode 100644 index 00000000..10814390 --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-index.c @@ -0,0 +1,659 @@ +/* + * "$Id: mxml-index.c 451 2014-01-04 21:50:06Z msweet $" + * + * Index support code for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include "config.h" +#include "mxml.h" + + +/* + * Sort functions... + */ + +static int index_compare(mxml_index_t *ind, mxml_node_t *first, + mxml_node_t *second); +static int index_find(mxml_index_t *ind, const char *element, + const char *value, mxml_node_t *node); +static void index_sort(mxml_index_t *ind, int left, int right); + + +/* + * 'mxmlIndexDelete()' - Delete an index. + */ + +void +mxmlIndexDelete(mxml_index_t *ind) /* I - Index to delete */ +{ + /* + * Range check input.. + */ + + if (!ind) + return; + + /* + * Free memory... + */ + + if (ind->attr) + free(ind->attr); + + if (ind->alloc_nodes) + free(ind->nodes); + + free(ind); +} + + +/* + * 'mxmlIndexEnum()' - Return the next node in the index. + * + * Nodes are returned in the sorted order of the index. + */ + +mxml_node_t * /* O - Next node or NULL if there is none */ +mxmlIndexEnum(mxml_index_t *ind) /* I - Index to enumerate */ +{ + /* + * Range check input... + */ + + if (!ind) + return (NULL); + + /* + * Return the next node... + */ + + if (ind->cur_node < ind->num_nodes) + return (ind->nodes[ind->cur_node ++]); + else + return (NULL); +} + + +/* + * 'mxmlIndexFind()' - Find the next matching node. + * + * You should call mxmlIndexReset() prior to using this function for + * the first time with a particular set of "element" and "value" + * strings. Passing NULL for both "element" and "value" is equivalent + * to calling mxmlIndexEnum(). + */ + +mxml_node_t * /* O - Node or NULL if none found */ +mxmlIndexFind(mxml_index_t *ind, /* I - Index to search */ + const char *element, /* I - Element name to find, if any */ + const char *value) /* I - Attribute value, if any */ +{ + int diff, /* Difference between names */ + current, /* Current entity in search */ + first, /* First entity in search */ + last; /* Last entity in search */ + + +#ifdef DEBUG + printf("mxmlIndexFind(ind=%p, element=\"%s\", value=\"%s\")\n", + ind, element ? element : "(null)", value ? value : "(null)"); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!ind || (!ind->attr && value)) + { +#ifdef DEBUG + puts(" returning NULL..."); + printf(" ind->attr=\"%s\"\n", ind->attr ? ind->attr : "(null)"); +#endif /* DEBUG */ + + return (NULL); + } + + /* + * If both element and value are NULL, just enumerate the nodes in the + * index... + */ + + if (!element && !value) + return (mxmlIndexEnum(ind)); + + /* + * If there are no nodes in the index, return NULL... + */ + + if (!ind->num_nodes) + { +#ifdef DEBUG + puts(" returning NULL..."); + puts(" no nodes!"); +#endif /* DEBUG */ + + return (NULL); + } + + /* + * If cur_node == 0, then find the first matching node... + */ + + if (ind->cur_node == 0) + { + /* + * Find the first node using a modified binary search algorithm... + */ + + first = 0; + last = ind->num_nodes - 1; + +#ifdef DEBUG + printf(" find first time, num_nodes=%d...\n", ind->num_nodes); +#endif /* DEBUG */ + + while ((last - first) > 1) + { + current = (first + last) / 2; + +#ifdef DEBUG + printf(" first=%d, last=%d, current=%d\n", first, last, current); +#endif /* DEBUG */ + + if ((diff = index_find(ind, element, value, ind->nodes[current])) == 0) + { + /* + * Found a match, move back to find the first... + */ + +#ifdef DEBUG + puts(" match!"); +#endif /* DEBUG */ + + while (current > 0 && + !index_find(ind, element, value, ind->nodes[current - 1])) + current --; + +#ifdef DEBUG + printf(" returning first match=%d\n", current); +#endif /* DEBUG */ + + /* + * Return the first match and save the index to the next... + */ + + ind->cur_node = current + 1; + + return (ind->nodes[current]); + } + else if (diff < 0) + last = current; + else + first = current; + +#ifdef DEBUG + printf(" diff=%d\n", diff); +#endif /* DEBUG */ + } + + /* + * If we get this far, then we found exactly 0 or 1 matches... + */ + + for (current = first; current <= last; current ++) + if (!index_find(ind, element, value, ind->nodes[current])) + { + /* + * Found exactly one (or possibly two) match... + */ + +#ifdef DEBUG + printf(" returning only match %d...\n", current); +#endif /* DEBUG */ + + ind->cur_node = current + 1; + + return (ind->nodes[current]); + } + + /* + * No matches... + */ + + ind->cur_node = ind->num_nodes; + +#ifdef DEBUG + puts(" returning NULL..."); +#endif /* DEBUG */ + + return (NULL); + } + else if (ind->cur_node < ind->num_nodes && + !index_find(ind, element, value, ind->nodes[ind->cur_node])) + { + /* + * Return the next matching node... + */ + +#ifdef DEBUG + printf(" returning next match %d...\n", ind->cur_node); +#endif /* DEBUG */ + + return (ind->nodes[ind->cur_node ++]); + } + + /* + * If we get this far, then we have no matches... + */ + + ind->cur_node = ind->num_nodes; + +#ifdef DEBUG + puts(" returning NULL..."); +#endif /* DEBUG */ + + return (NULL); +} + + +/* + * 'mxmlIndexGetCount()' - Get the number of nodes in an index. + * + * @since Mini-XML 2.7@ + */ + +int /* I - Number of nodes in index */ +mxmlIndexGetCount(mxml_index_t *ind) /* I - Index of nodes */ +{ + /* + * Range check input... + */ + + if (!ind) + return (0); + + /* + * Return the number of nodes in the index... + */ + + return (ind->num_nodes); +} + + +/* + * 'mxmlIndexNew()' - Create a new index. + * + * The index will contain all nodes that contain the named element and/or + * attribute. If both "element" and "attr" are NULL, then the index will + * contain a sorted list of the elements in the node tree. Nodes are + * sorted by element name and optionally by attribute value if the "attr" + * argument is not NULL. + */ + +mxml_index_t * /* O - New index */ +mxmlIndexNew(mxml_node_t *node, /* I - XML node tree */ + const char *element, /* I - Element to index or NULL for all */ + const char *attr) /* I - Attribute to index or NULL for none */ +{ + mxml_index_t *ind; /* New index */ + mxml_node_t *current, /* Current node in index */ + **temp; /* Temporary node pointer array */ + + + /* + * Range check input... + */ + +#ifdef DEBUG + printf("mxmlIndexNew(node=%p, element=\"%s\", attr=\"%s\")\n", + node, element ? element : "(null)", attr ? attr : "(null)"); +#endif /* DEBUG */ + + if (!node) + return (NULL); + + /* + * Create a new index... + */ + + if ((ind = calloc(1, sizeof(mxml_index_t))) == NULL) + { + mxml_error("Unable to allocate %d bytes for index - %s", + sizeof(mxml_index_t), strerror(errno)); + return (NULL); + } + + if (attr) + ind->attr = strdup(attr); + + if (!element && !attr) + current = node; + else + current = mxmlFindElement(node, node, element, attr, NULL, MXML_DESCEND); + + while (current) + { + if (ind->num_nodes >= ind->alloc_nodes) + { + if (!ind->alloc_nodes) + temp = malloc(64 * sizeof(mxml_node_t *)); + else + temp = realloc(ind->nodes, (ind->alloc_nodes + 64) * sizeof(mxml_node_t *)); + + if (!temp) + { + /* + * Unable to allocate memory for the index, so abort... + */ + + mxml_error("Unable to allocate %d bytes for index: %s", + (ind->alloc_nodes + 64) * sizeof(mxml_node_t *), + strerror(errno)); + + mxmlIndexDelete(ind); + return (NULL); + } + + ind->nodes = temp; + ind->alloc_nodes += 64; + } + + ind->nodes[ind->num_nodes ++] = current; + + current = mxmlFindElement(current, node, element, attr, NULL, MXML_DESCEND); + } + + /* + * Sort nodes based upon the search criteria... + */ + +#ifdef DEBUG + { + int i; /* Looping var */ + + + printf("%d node(s) in index.\n\n", ind->num_nodes); + + if (attr) + { + printf("Node Address Element %s\n", attr); + puts("-------- -------- -------------- ------------------------------"); + + for (i = 0; i < ind->num_nodes; i ++) + printf("%8d %-8p %-14.14s %s\n", i, ind->nodes[i], + ind->nodes[i]->value.element.name, + mxmlElementGetAttr(ind->nodes[i], attr)); + } + else + { + puts("Node Address Element"); + puts("-------- -------- --------------"); + + for (i = 0; i < ind->num_nodes; i ++) + printf("%8d %-8p %s\n", i, ind->nodes[i], + ind->nodes[i]->value.element.name); + } + + putchar('\n'); + } +#endif /* DEBUG */ + + if (ind->num_nodes > 1) + index_sort(ind, 0, ind->num_nodes - 1); + +#ifdef DEBUG + { + int i; /* Looping var */ + + + puts("After sorting:\n"); + + if (attr) + { + printf("Node Address Element %s\n", attr); + puts("-------- -------- -------------- ------------------------------"); + + for (i = 0; i < ind->num_nodes; i ++) + printf("%8d %-8p %-14.14s %s\n", i, ind->nodes[i], + ind->nodes[i]->value.element.name, + mxmlElementGetAttr(ind->nodes[i], attr)); + } + else + { + puts("Node Address Element"); + puts("-------- -------- --------------"); + + for (i = 0; i < ind->num_nodes; i ++) + printf("%8d %-8p %s\n", i, ind->nodes[i], + ind->nodes[i]->value.element.name); + } + + putchar('\n'); + } +#endif /* DEBUG */ + + /* + * Return the new index... + */ + + return (ind); +} + + +/* + * 'mxmlIndexReset()' - Reset the enumeration/find pointer in the index and + * return the first node in the index. + * + * This function should be called prior to using mxmlIndexEnum() or + * mxmlIndexFind() for the first time. + */ + +mxml_node_t * /* O - First node or NULL if there is none */ +mxmlIndexReset(mxml_index_t *ind) /* I - Index to reset */ +{ +#ifdef DEBUG + printf("mxmlIndexReset(ind=%p)\n", ind); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!ind) + return (NULL); + + /* + * Set the index to the first element... + */ + + ind->cur_node = 0; + + /* + * Return the first node... + */ + + if (ind->num_nodes) + return (ind->nodes[0]); + else + return (NULL); +} + + +/* + * 'index_compare()' - Compare two nodes. + */ + +static int /* O - Result of comparison */ +index_compare(mxml_index_t *ind, /* I - Index */ + mxml_node_t *first, /* I - First node */ + mxml_node_t *second) /* I - Second node */ +{ + int diff; /* Difference */ + + + /* + * Check the element name... + */ + + if ((diff = strcmp(first->value.element.name, + second->value.element.name)) != 0) + return (diff); + + /* + * Check the attribute value... + */ + + if (ind->attr) + { + if ((diff = strcmp(mxmlElementGetAttr(first, ind->attr), + mxmlElementGetAttr(second, ind->attr))) != 0) + return (diff); + } + + /* + * No difference, return 0... + */ + + return (0); +} + + +/* + * 'index_find()' - Compare a node with index values. + */ + +static int /* O - Result of comparison */ +index_find(mxml_index_t *ind, /* I - Index */ + const char *element, /* I - Element name or NULL */ + const char *value, /* I - Attribute value or NULL */ + mxml_node_t *node) /* I - Node */ +{ + int diff; /* Difference */ + + + /* + * Check the element name... + */ + + if (element) + { + if ((diff = strcmp(element, node->value.element.name)) != 0) + return (diff); + } + + /* + * Check the attribute value... + */ + + if (value) + { + if ((diff = strcmp(value, mxmlElementGetAttr(node, ind->attr))) != 0) + return (diff); + } + + /* + * No difference, return 0... + */ + + return (0); +} + + +/* + * 'index_sort()' - Sort the nodes in the index... + * + * This function implements the classic quicksort algorithm... + */ + +static void +index_sort(mxml_index_t *ind, /* I - Index to sort */ + int left, /* I - Left node in partition */ + int right) /* I - Right node in partition */ +{ + mxml_node_t *pivot, /* Pivot node */ + *temp; /* Swap node */ + int templ, /* Temporary left node */ + tempr; /* Temporary right node */ + + + /* + * Loop until we have sorted all the way to the right... + */ + + do + { + /* + * Sort the pivot in the current partition... + */ + + pivot = ind->nodes[left]; + + for (templ = left, tempr = right; templ < tempr;) + { + /* + * Move left while left node <= pivot node... + */ + + while ((templ < right) && + index_compare(ind, ind->nodes[templ], pivot) <= 0) + templ ++; + + /* + * Move right while right node > pivot node... + */ + + while ((tempr > left) && + index_compare(ind, ind->nodes[tempr], pivot) > 0) + tempr --; + + /* + * Swap nodes if needed... + */ + + if (templ < tempr) + { + temp = ind->nodes[templ]; + ind->nodes[templ] = ind->nodes[tempr]; + ind->nodes[tempr] = temp; + } + } + + /* + * When we get here, the right (tempr) node is the new position for the + * pivot node... + */ + + if (index_compare(ind, pivot, ind->nodes[tempr]) > 0) + { + ind->nodes[left] = ind->nodes[tempr]; + ind->nodes[tempr] = pivot; + } + + /* + * Recursively sort the left partition as needed... + */ + + if (left < (tempr - 1)) + index_sort(ind, left, tempr - 1); + } + while (right > (left = tempr + 1)); +} + + +/* + * End of "$Id: mxml-index.c 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-node.c b/tools/gator/daemon/mxml/mxml-node.c new file mode 100644 index 00000000..128cda1a --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-node.c @@ -0,0 +1,788 @@ +/* + * "$Id: mxml-node.c 451 2014-01-04 21:50:06Z msweet $" + * + * Node support code for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include "config.h" +#include "mxml.h" + + +/* + * Local functions... + */ + +static mxml_node_t *mxml_new(mxml_node_t *parent, mxml_type_t type); + + +/* + * 'mxmlAdd()' - Add a node to a tree. + * + * Adds the specified node to the parent. If the child argument is not + * NULL, puts the new node before or after the specified child depending + * on the value of the where argument. If the child argument is NULL, + * puts the new node at the beginning of the child list (MXML_ADD_BEFORE) + * or at the end of the child list (MXML_ADD_AFTER). The constant + * MXML_ADD_TO_PARENT can be used to specify a NULL child pointer. + */ + +void +mxmlAdd(mxml_node_t *parent, /* I - Parent node */ + int where, /* I - Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER */ + mxml_node_t *child, /* I - Child node for where or MXML_ADD_TO_PARENT */ + mxml_node_t *node) /* I - Node to add */ +{ +#ifdef DEBUG + fprintf(stderr, "mxmlAdd(parent=%p, where=%d, child=%p, node=%p)\n", parent, + where, child, node); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!parent || !node) + return; + +#if DEBUG > 1 + fprintf(stderr, " BEFORE: node->parent=%p\n", node->parent); + if (parent) + { + fprintf(stderr, " BEFORE: parent->child=%p\n", parent->child); + fprintf(stderr, " BEFORE: parent->last_child=%p\n", parent->last_child); + fprintf(stderr, " BEFORE: parent->prev=%p\n", parent->prev); + fprintf(stderr, " BEFORE: parent->next=%p\n", parent->next); + } +#endif /* DEBUG > 1 */ + + /* + * Remove the node from any existing parent... + */ + + if (node->parent) + mxmlRemove(node); + + /* + * Reset pointers... + */ + + node->parent = parent; + + switch (where) + { + case MXML_ADD_BEFORE : + if (!child || child == parent->child || child->parent != parent) + { + /* + * Insert as first node under parent... + */ + + node->next = parent->child; + + if (parent->child) + parent->child->prev = node; + else + parent->last_child = node; + + parent->child = node; + } + else + { + /* + * Insert node before this child... + */ + + node->next = child; + node->prev = child->prev; + + if (child->prev) + child->prev->next = node; + else + parent->child = node; + + child->prev = node; + } + break; + + case MXML_ADD_AFTER : + if (!child || child == parent->last_child || child->parent != parent) + { + /* + * Insert as last node under parent... + */ + + node->parent = parent; + node->prev = parent->last_child; + + if (parent->last_child) + parent->last_child->next = node; + else + parent->child = node; + + parent->last_child = node; + } + else + { + /* + * Insert node after this child... + */ + + node->prev = child; + node->next = child->next; + + if (child->next) + child->next->prev = node; + else + parent->last_child = node; + + child->next = node; + } + break; + } + +#if DEBUG > 1 + fprintf(stderr, " AFTER: node->parent=%p\n", node->parent); + if (parent) + { + fprintf(stderr, " AFTER: parent->child=%p\n", parent->child); + fprintf(stderr, " AFTER: parent->last_child=%p\n", parent->last_child); + fprintf(stderr, " AFTER: parent->prev=%p\n", parent->prev); + fprintf(stderr, " AFTER: parent->next=%p\n", parent->next); + } +#endif /* DEBUG > 1 */ +} + + +/* + * 'mxmlDelete()' - Delete a node and all of its children. + * + * If the specified node has a parent, this function first removes the + * node from its parent using the mxmlRemove() function. + */ + +void +mxmlDelete(mxml_node_t *node) /* I - Node to delete */ +{ + int i; /* Looping var */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlDelete(node=%p)\n", node); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!node) + return; + + /* + * Remove the node from its parent, if any... + */ + + mxmlRemove(node); + + /* + * Delete children... + */ + + while (node->child) + mxmlDelete(node->child); + + /* + * Now delete any node data... + */ + + switch (node->type) + { + case MXML_ELEMENT : + if (node->value.element.name) + free(node->value.element.name); + + if (node->value.element.num_attrs) + { + for (i = 0; i < node->value.element.num_attrs; i ++) + { + if (node->value.element.attrs[i].name) + free(node->value.element.attrs[i].name); + if (node->value.element.attrs[i].value) + free(node->value.element.attrs[i].value); + } + + free(node->value.element.attrs); + } + break; + case MXML_INTEGER : + /* Nothing to do */ + break; + case MXML_OPAQUE : + if (node->value.opaque) + free(node->value.opaque); + break; + case MXML_REAL : + /* Nothing to do */ + break; + case MXML_TEXT : + if (node->value.text.string) + free(node->value.text.string); + break; + case MXML_CUSTOM : + if (node->value.custom.data && + node->value.custom.destroy) + (*(node->value.custom.destroy))(node->value.custom.data); + break; + default : + break; + } + + /* + * Free this node... + */ + + free(node); +} + + +/* + * 'mxmlGetRefCount()' - Get the current reference (use) count for a node. + * + * The initial reference count of new nodes is 1. Use the @link mxmlRetain@ + * and @link mxmlRelease@ functions to increment and decrement a node's + * reference count. + * + * @since Mini-XML 2.7@. + */ + +int /* O - Reference count */ +mxmlGetRefCount(mxml_node_t *node) /* I - Node */ +{ + /* + * Range check input... + */ + + if (!node) + return (0); + + /* + * Return the reference count... + */ + + return (node->ref_count); +} + + +/* + * 'mxmlNewCDATA()' - Create a new CDATA node. + * + * The new CDATA node is added to the end of the specified parent's child + * list. The constant MXML_NO_PARENT can be used to specify that the new + * CDATA node has no parent. The data string must be nul-terminated and + * is copied into the new node. CDATA nodes use the MXML_ELEMENT type. + * + * @since Mini-XML 2.3@ + */ + +mxml_node_t * /* O - New node */ +mxmlNewCDATA(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ + const char *data) /* I - Data string */ +{ + mxml_node_t *node; /* New node */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlNewCDATA(parent=%p, data=\"%s\")\n", + parent, data ? data : "(null)"); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!data) + return (NULL); + + /* + * Create the node and set the name value... + */ + + if ((node = mxml_new(parent, MXML_ELEMENT)) != NULL) + node->value.element.name = _mxml_strdupf("![CDATA[%s]]", data); + + return (node); +} + + +/* + * 'mxmlNewCustom()' - Create a new custom data node. + * + * The new custom node is added to the end of the specified parent's child + * list. The constant MXML_NO_PARENT can be used to specify that the new + * element node has no parent. NULL can be passed when the data in the + * node is not dynamically allocated or is separately managed. + * + * @since Mini-XML 2.1@ + */ + +mxml_node_t * /* O - New node */ +mxmlNewCustom( + mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ + void *data, /* I - Pointer to data */ + mxml_custom_destroy_cb_t destroy) /* I - Function to destroy data */ +{ + mxml_node_t *node; /* New node */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlNewCustom(parent=%p, data=%p, destroy=%p)\n", parent, + data, destroy); +#endif /* DEBUG */ + + /* + * Create the node and set the value... + */ + + if ((node = mxml_new(parent, MXML_CUSTOM)) != NULL) + { + node->value.custom.data = data; + node->value.custom.destroy = destroy; + } + + return (node); +} + + +/* + * 'mxmlNewElement()' - Create a new element node. + * + * The new element node is added to the end of the specified parent's child + * list. The constant MXML_NO_PARENT can be used to specify that the new + * element node has no parent. + */ + +mxml_node_t * /* O - New node */ +mxmlNewElement(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ + const char *name) /* I - Name of element */ +{ + mxml_node_t *node; /* New node */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlNewElement(parent=%p, name=\"%s\")\n", parent, + name ? name : "(null)"); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!name) + return (NULL); + + /* + * Create the node and set the element name... + */ + + if ((node = mxml_new(parent, MXML_ELEMENT)) != NULL) + node->value.element.name = strdup(name); + + return (node); +} + + +/* + * 'mxmlNewInteger()' - Create a new integer node. + * + * The new integer node is added to the end of the specified parent's child + * list. The constant MXML_NO_PARENT can be used to specify that the new + * integer node has no parent. + */ + +mxml_node_t * /* O - New node */ +mxmlNewInteger(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ + int integer) /* I - Integer value */ +{ + mxml_node_t *node; /* New node */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlNewInteger(parent=%p, integer=%d)\n", parent, integer); +#endif /* DEBUG */ + + /* + * Create the node and set the element name... + */ + + if ((node = mxml_new(parent, MXML_INTEGER)) != NULL) + node->value.integer = integer; + + return (node); +} + + +/* + * 'mxmlNewOpaque()' - Create a new opaque string. + * + * The new opaque node is added to the end of the specified parent's child + * list. The constant MXML_NO_PARENT can be used to specify that the new + * opaque node has no parent. The opaque string must be nul-terminated and + * is copied into the new node. + */ + +mxml_node_t * /* O - New node */ +mxmlNewOpaque(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ + const char *opaque) /* I - Opaque string */ +{ + mxml_node_t *node; /* New node */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlNewOpaque(parent=%p, opaque=\"%s\")\n", parent, + opaque ? opaque : "(null)"); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!opaque) + return (NULL); + + /* + * Create the node and set the element name... + */ + + if ((node = mxml_new(parent, MXML_OPAQUE)) != NULL) + node->value.opaque = strdup(opaque); + + return (node); +} + + +/* + * 'mxmlNewReal()' - Create a new real number node. + * + * The new real number node is added to the end of the specified parent's + * child list. The constant MXML_NO_PARENT can be used to specify that + * the new real number node has no parent. + */ + +mxml_node_t * /* O - New node */ +mxmlNewReal(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ + double real) /* I - Real number value */ +{ + mxml_node_t *node; /* New node */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlNewReal(parent=%p, real=%g)\n", parent, real); +#endif /* DEBUG */ + + /* + * Create the node and set the element name... + */ + + if ((node = mxml_new(parent, MXML_REAL)) != NULL) + node->value.real = real; + + return (node); +} + + +/* + * 'mxmlNewText()' - Create a new text fragment node. + * + * The new text node is added to the end of the specified parent's child + * list. The constant MXML_NO_PARENT can be used to specify that the new + * text node has no parent. The whitespace parameter is used to specify + * whether leading whitespace is present before the node. The text + * string must be nul-terminated and is copied into the new node. + */ + +mxml_node_t * /* O - New node */ +mxmlNewText(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ + int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */ + const char *string) /* I - String */ +{ + mxml_node_t *node; /* New node */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlNewText(parent=%p, whitespace=%d, string=\"%s\")\n", + parent, whitespace, string ? string : "(null)"); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!string) + return (NULL); + + /* + * Create the node and set the text value... + */ + + if ((node = mxml_new(parent, MXML_TEXT)) != NULL) + { + node->value.text.whitespace = whitespace; + node->value.text.string = strdup(string); + } + + return (node); +} + + +/* + * 'mxmlNewTextf()' - Create a new formatted text fragment node. + * + * The new text node is added to the end of the specified parent's child + * list. The constant MXML_NO_PARENT can be used to specify that the new + * text node has no parent. The whitespace parameter is used to specify + * whether leading whitespace is present before the node. The format + * string must be nul-terminated and is formatted into the new node. + */ + +mxml_node_t * /* O - New node */ +mxmlNewTextf(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */ + int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */ + const char *format, /* I - Printf-style frmat string */ + ...) /* I - Additional args as needed */ +{ + mxml_node_t *node; /* New node */ + va_list ap; /* Pointer to arguments */ + + +#ifdef DEBUG + fprintf(stderr, "mxmlNewTextf(parent=%p, whitespace=%d, format=\"%s\", ...)\n", + parent, whitespace, format ? format : "(null)"); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!format) + return (NULL); + + /* + * Create the node and set the text value... + */ + + if ((node = mxml_new(parent, MXML_TEXT)) != NULL) + { + va_start(ap, format); + + node->value.text.whitespace = whitespace; + node->value.text.string = _mxml_vstrdupf(format, ap); + + va_end(ap); + } + + return (node); +} + + +/* + * 'mxmlRemove()' - Remove a node from its parent. + * + * Does not free memory used by the node - use mxmlDelete() for that. + * This function does nothing if the node has no parent. + */ + +void +mxmlRemove(mxml_node_t *node) /* I - Node to remove */ +{ +#ifdef DEBUG + fprintf(stderr, "mxmlRemove(node=%p)\n", node); +#endif /* DEBUG */ + + /* + * Range check input... + */ + + if (!node || !node->parent) + return; + + /* + * Remove from parent... + */ + +#if DEBUG > 1 + fprintf(stderr, " BEFORE: node->parent=%p\n", node->parent); + if (node->parent) + { + fprintf(stderr, " BEFORE: node->parent->child=%p\n", node->parent->child); + fprintf(stderr, " BEFORE: node->parent->last_child=%p\n", node->parent->last_child); + } + fprintf(stderr, " BEFORE: node->child=%p\n", node->child); + fprintf(stderr, " BEFORE: node->last_child=%p\n", node->last_child); + fprintf(stderr, " BEFORE: node->prev=%p\n", node->prev); + fprintf(stderr, " BEFORE: node->next=%p\n", node->next); +#endif /* DEBUG > 1 */ + + if (node->prev) + node->prev->next = node->next; + else + node->parent->child = node->next; + + if (node->next) + node->next->prev = node->prev; + else + node->parent->last_child = node->prev; + + node->parent = NULL; + node->prev = NULL; + node->next = NULL; + +#if DEBUG > 1 + fprintf(stderr, " AFTER: node->parent=%p\n", node->parent); + if (node->parent) + { + fprintf(stderr, " AFTER: node->parent->child=%p\n", node->parent->child); + fprintf(stderr, " AFTER: node->parent->last_child=%p\n", node->parent->last_child); + } + fprintf(stderr, " AFTER: node->child=%p\n", node->child); + fprintf(stderr, " AFTER: node->last_child=%p\n", node->last_child); + fprintf(stderr, " AFTER: node->prev=%p\n", node->prev); + fprintf(stderr, " AFTER: node->next=%p\n", node->next); +#endif /* DEBUG > 1 */ +} + + +/* + * 'mxmlNewXML()' - Create a new XML document tree. + * + * The "version" argument specifies the version number to put in the + * ?xml element node. If NULL, version 1.0 is assumed. + * + * @since Mini-XML 2.3@ + */ + +mxml_node_t * /* O - New ?xml node */ +mxmlNewXML(const char *version) /* I - Version number to use */ +{ + char element[1024]; /* Element text */ + + + snprintf(element, sizeof(element), "?xml version=\"%s\" encoding=\"utf-8\"?", + version ? version : "1.0"); + + return (mxmlNewElement(NULL, element)); +} + + +/* + * 'mxmlRelease()' - Release a node. + * + * When the reference count reaches zero, the node (and any children) + * is deleted via mxmlDelete(). + * + * @since Mini-XML 2.3@ + */ + +int /* O - New reference count */ +mxmlRelease(mxml_node_t *node) /* I - Node */ +{ + if (node) + { + if ((-- node->ref_count) <= 0) + { + mxmlDelete(node); + return (0); + } + else + return (node->ref_count); + } + else + return (-1); +} + + +/* + * 'mxmlRetain()' - Retain a node. + * + * @since Mini-XML 2.3@ + */ + +int /* O - New reference count */ +mxmlRetain(mxml_node_t *node) /* I - Node */ +{ + if (node) + return (++ node->ref_count); + else + return (-1); +} + + +/* + * 'mxml_new()' - Create a new node. + */ + +static mxml_node_t * /* O - New node */ +mxml_new(mxml_node_t *parent, /* I - Parent node */ + mxml_type_t type) /* I - Node type */ +{ + mxml_node_t *node; /* New node */ + + +#if DEBUG > 1 + fprintf(stderr, "mxml_new(parent=%p, type=%d)\n", parent, type); +#endif /* DEBUG > 1 */ + + /* + * Allocate memory for the node... + */ + + if ((node = calloc(1, sizeof(mxml_node_t))) == NULL) + { +#if DEBUG > 1 + fputs(" returning NULL\n", stderr); +#endif /* DEBUG > 1 */ + + return (NULL); + } + +#if DEBUG > 1 + fprintf(stderr, " returning %p\n", node); +#endif /* DEBUG > 1 */ + + /* + * Set the node type... + */ + + node->type = type; + node->ref_count = 1; + + /* + * Add to the parent if present... + */ + + if (parent) + mxmlAdd(parent, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, node); + + /* + * Return the new node... + */ + + return (node); +} + + +/* + * End of "$Id: mxml-node.c 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-private.c b/tools/gator/daemon/mxml/mxml-private.c new file mode 100644 index 00000000..bec4bbfb --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-private.c @@ -0,0 +1,323 @@ +/* + * "$Id: mxml-private.c 451 2014-01-04 21:50:06Z msweet $" + * + * Private functions for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include "mxml-private.h" + + +/* + * Some crazy people think that unloading a shared object is a good or safe + * thing to do. Unfortunately, most objects are simply *not* safe to unload + * and bad things *will* happen. + * + * The following mess of conditional code allows us to provide a destructor + * function in Mini-XML for our thread-global storage so that it can possibly + * be unloaded safely, although since there is no standard way to do so I + * can't even provide any guarantees that you can do it safely on all platforms. + * + * This code currently supports AIX, HP-UX, Linux, Mac OS X, Solaris, and + * Windows. It might work on the BSDs and IRIX, but I haven't tested that. + */ + +#if defined(__sun) || defined(_AIX) +# pragma fini(_mxml_fini) +# define _MXML_FINI _mxml_fini +#elif defined(__hpux) +# pragma FINI _mxml_fini +# define _MXML_FINI _mxml_fini +#elif defined(__GNUC__) /* Linux and Mac OS X */ +# define _MXML_FINI __attribute((destructor)) _mxml_fini +#else +# define _MXML_FINI _fini +#endif /* __sun */ + + +/* + * 'mxml_error()' - Display an error message. + */ + +void +mxml_error(const char *format, /* I - Printf-style format string */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Pointer to arguments */ + char s[1024]; /* Message string */ + _mxml_global_t *global = _mxml_global(); + /* Global data */ + + + /* + * Range check input... + */ + + if (!format) + return; + + /* + * Format the error message string... + */ + + va_start(ap, format); + + vsnprintf(s, sizeof(s), format, ap); + + va_end(ap); + + /* + * And then display the error message... + */ + + if (global->error_cb) + (*global->error_cb)(s); + else + fprintf(stderr, "mxml: %s\n", s); +} + + +/* + * 'mxml_ignore_cb()' - Default callback for ignored values. + */ + +mxml_type_t /* O - Node type */ +mxml_ignore_cb(mxml_node_t *node) /* I - Current node */ +{ + (void)node; + + return (MXML_IGNORE); +} + + +/* + * 'mxml_integer_cb()' - Default callback for integer values. + */ + +mxml_type_t /* O - Node type */ +mxml_integer_cb(mxml_node_t *node) /* I - Current node */ +{ + (void)node; + + return (MXML_INTEGER); +} + + +/* + * 'mxml_opaque_cb()' - Default callback for opaque values. + */ + +mxml_type_t /* O - Node type */ +mxml_opaque_cb(mxml_node_t *node) /* I - Current node */ +{ + (void)node; + + return (MXML_OPAQUE); +} + + +/* + * 'mxml_real_cb()' - Default callback for real number values. + */ + +mxml_type_t /* O - Node type */ +mxml_real_cb(mxml_node_t *node) /* I - Current node */ +{ + (void)node; + + return (MXML_REAL); +} + + +#ifdef HAVE_PTHREAD_H /**** POSIX threading ****/ +# include + +static pthread_key_t _mxml_key = -1; /* Thread local storage key */ +static pthread_once_t _mxml_key_once = PTHREAD_ONCE_INIT; + /* One-time initialization object */ +static void _mxml_init(void); +static void _mxml_destructor(void *g); + + +/* + * '_mxml_destructor()' - Free memory used for globals... + */ + +static void +_mxml_destructor(void *g) /* I - Global data */ +{ + free(g); +} + + +/* + * '_mxml_fini()' - Clean up when unloaded. + */ + +static void +_MXML_FINI(void) +{ + _mxml_global_t *global; /* Global data */ + + + if (_mxml_key != -1) + { + if ((global = (_mxml_global_t *)pthread_getspecific(_mxml_key)) != NULL) + _mxml_destructor(global); + + pthread_key_delete(_mxml_key); + _mxml_key = -1; + } +} + + +/* + * '_mxml_global()' - Get global data. + */ + +_mxml_global_t * /* O - Global data */ +_mxml_global(void) +{ + _mxml_global_t *global; /* Global data */ + + + pthread_once(&_mxml_key_once, _mxml_init); + + if ((global = (_mxml_global_t *)pthread_getspecific(_mxml_key)) == NULL) + { + global = (_mxml_global_t *)calloc(1, sizeof(_mxml_global_t)); + pthread_setspecific(_mxml_key, global); + + global->num_entity_cbs = 1; + global->entity_cbs[0] = _mxml_entity_cb; + global->wrap = 72; + } + + return (global); +} + + +/* + * '_mxml_init()' - Initialize global data... + */ + +static void +_mxml_init(void) +{ + pthread_key_create(&_mxml_key, _mxml_destructor); +} + + +#elif defined(WIN32) && defined(MXML1_EXPORTS) /**** WIN32 threading ****/ +# include + +static DWORD _mxml_tls_index; /* Index for global storage */ + + +/* + * 'DllMain()' - Main entry for library. + */ + +BOOL WINAPI /* O - Success/failure */ +DllMain(HINSTANCE hinst, /* I - DLL module handle */ + DWORD reason, /* I - Reason */ + LPVOID reserved) /* I - Unused */ +{ + _mxml_global_t *global; /* Global data */ + + + (void)hinst; + (void)reserved; + + switch (reason) + { + case DLL_PROCESS_ATTACH : /* Called on library initialization */ + if ((_mxml_tls_index = TlsAlloc()) == TLS_OUT_OF_INDEXES) + return (FALSE); + break; + + case DLL_THREAD_DETACH : /* Called when a thread terminates */ + if ((global = (_mxml_global_t *)TlsGetValue(_mxml_tls_index)) != NULL) + free(global); + break; + + case DLL_PROCESS_DETACH : /* Called when library is unloaded */ + if ((global = (_mxml_global_t *)TlsGetValue(_mxml_tls_index)) != NULL) + free(global); + + TlsFree(_mxml_tls_index); + break; + + default: + break; + } + + return (TRUE); +} + + +/* + * '_mxml_global()' - Get global data. + */ + +_mxml_global_t * /* O - Global data */ +_mxml_global(void) +{ + _mxml_global_t *global; /* Global data */ + + + if ((global = (_mxml_global_t *)TlsGetValue(_mxml_tls_index)) == NULL) + { + global = (_mxml_global_t *)calloc(1, sizeof(_mxml_global_t)); + + global->num_entity_cbs = 1; + global->entity_cbs[0] = _mxml_entity_cb; + global->wrap = 72; + + TlsSetValue(_mxml_tls_index, (LPVOID)global); + } + + return (global); +} + + +#else /**** No threading ****/ +/* + * '_mxml_global()' - Get global data. + */ + +_mxml_global_t * /* O - Global data */ +_mxml_global(void) +{ + static _mxml_global_t global = /* Global data */ + { + NULL, /* error_cb */ + 1, /* num_entity_cbs */ + { _mxml_entity_cb }, /* entity_cbs */ + 72, /* wrap */ + NULL, /* custom_load_cb */ + NULL /* custom_save_cb */ + }; + + + return (&global); +} +#endif /* HAVE_PTHREAD_H */ + + +/* + * End of "$Id: mxml-private.c 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-private.h b/tools/gator/daemon/mxml/mxml-private.h new file mode 100644 index 00000000..c5e4e6b6 --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-private.h @@ -0,0 +1,50 @@ +/* + * "$Id: mxml-private.h 451 2014-01-04 21:50:06Z msweet $" + * + * Private definitions for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include "config.h" +#include "mxml.h" + + +/* + * Global, per-thread data... + */ + +typedef struct _mxml_global_s +{ + void (*error_cb)(const char *); + int num_entity_cbs; + int (*entity_cbs[100])(const char *name); + int wrap; + mxml_custom_load_cb_t custom_load_cb; + mxml_custom_save_cb_t custom_save_cb; +} _mxml_global_t; + + +/* + * Functions... + */ + +extern _mxml_global_t *_mxml_global(void); +extern int _mxml_entity_cb(const char *name); + + +/* + * End of "$Id: mxml-private.h 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-search.c b/tools/gator/daemon/mxml/mxml-search.c new file mode 100644 index 00000000..313a52f0 --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-search.c @@ -0,0 +1,280 @@ +/* + * "$Id: mxml-search.c 451 2014-01-04 21:50:06Z msweet $" + * + * Search/navigation functions for Mini-XML, a small XML-like file + * parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include "config.h" +#include "mxml.h" + + +/* + * 'mxmlFindElement()' - Find the named element. + * + * The search is constrained by the name, attribute name, and value; any + * NULL names or values are treated as wildcards, so different kinds of + * searches can be implemented by looking for all elements of a given name + * or all elements with a specific attribute. The descend argument determines + * whether the search descends into child nodes; normally you will use + * MXML_DESCEND_FIRST for the initial search and MXML_NO_DESCEND to find + * additional direct descendents of the node. The top node argument + * constrains the search to a particular node's children. + */ + +mxml_node_t * /* O - Element node or NULL */ +mxmlFindElement(mxml_node_t *node, /* I - Current node */ + mxml_node_t *top, /* I - Top node */ + const char *name, /* I - Element name or NULL for any */ + const char *attr, /* I - Attribute name, or NULL for none */ + const char *value, /* I - Attribute value, or NULL for any */ + int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */ +{ + const char *temp; /* Current attribute value */ + + + /* + * Range check input... + */ + + if (!node || !top || (!attr && value)) + return (NULL); + + /* + * Start with the next node... + */ + + node = mxmlWalkNext(node, top, descend); + + /* + * Loop until we find a matching element... + */ + + while (node != NULL) + { + /* + * See if this node matches... + */ + + if (node->type == MXML_ELEMENT && + node->value.element.name && + (!name || !strcmp(node->value.element.name, name))) + { + /* + * See if we need to check for an attribute... + */ + + if (!attr) + return (node); /* No attribute search, return it... */ + + /* + * Check for the attribute... + */ + + if ((temp = mxmlElementGetAttr(node, attr)) != NULL) + { + /* + * OK, we have the attribute, does it match? + */ + + if (!value || !strcmp(value, temp)) + return (node); /* Yes, return it... */ + } + } + + /* + * No match, move on to the next node... + */ + + if (descend == MXML_DESCEND) + node = mxmlWalkNext(node, top, MXML_DESCEND); + else + node = node->next; + } + + return (NULL); +} + + +/* + * 'mxmlFindPath()' - Find a node with the given path. + * + * The "path" is a slash-separated list of element names. The name "*" is + * considered a wildcard for one or more levels of elements. For example, + * "foo/one/two", "bar/two/one", "*\/one", and so forth. + * + * The first child node of the found node is returned if the given node has + * children and the first child is a value node. + * + * @since Mini-XML 2.7@ + */ + +mxml_node_t * /* O - Found node or NULL */ +mxmlFindPath(mxml_node_t *top, /* I - Top node */ + const char *path) /* I - Path to element */ +{ + mxml_node_t *node; /* Current node */ + char element[256]; /* Current element name */ + const char *pathsep; /* Separator in path */ + int descend; /* mxmlFindElement option */ + + + /* + * Range check input... + */ + + if (!top || !path || !*path) + return (NULL); + + /* + * Search each element in the path... + */ + + node = top; + while (*path) + { + /* + * Handle wildcards... + */ + + if (!strncmp(path, "*/", 2)) + { + path += 2; + descend = MXML_DESCEND; + } + else + descend = MXML_DESCEND_FIRST; + + /* + * Get the next element in the path... + */ + + if ((pathsep = strchr(path, '/')) == NULL) + pathsep = path + strlen(path); + + if (pathsep == path || (pathsep - path) >= sizeof(element)) + return (NULL); + + memcpy(element, path, pathsep - path); + element[pathsep - path] = '\0'; + + if (*pathsep) + path = pathsep + 1; + else + path = pathsep; + + /* + * Search for the element... + */ + + if ((node = mxmlFindElement(node, node, element, NULL, NULL, + descend)) == NULL) + return (NULL); + } + + /* + * If we get this far, return the node or its first child... + */ + + if (node->child && node->child->type != MXML_ELEMENT) + return (node->child); + else + return (node); +} + + +/* + * 'mxmlWalkNext()' - Walk to the next logical node in the tree. + * + * The descend argument controls whether the first child is considered + * to be the next node. The top node argument constrains the walk to + * the node's children. + */ + +mxml_node_t * /* O - Next node or NULL */ +mxmlWalkNext(mxml_node_t *node, /* I - Current node */ + mxml_node_t *top, /* I - Top node */ + int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */ +{ + if (!node) + return (NULL); + else if (node->child && descend) + return (node->child); + else if (node == top) + return (NULL); + else if (node->next) + return (node->next); + else if (node->parent && node->parent != top) + { + node = node->parent; + + while (!node->next) + if (node->parent == top || !node->parent) + return (NULL); + else + node = node->parent; + + return (node->next); + } + else + return (NULL); +} + + +/* + * 'mxmlWalkPrev()' - Walk to the previous logical node in the tree. + * + * The descend argument controls whether the previous node's last child + * is considered to be the previous node. The top node argument constrains + * the walk to the node's children. + */ + +mxml_node_t * /* O - Previous node or NULL */ +mxmlWalkPrev(mxml_node_t *node, /* I - Current node */ + mxml_node_t *top, /* I - Top node */ + int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */ +{ + if (!node || node == top) + return (NULL); + else if (node->prev) + { + if (node->prev->last_child && descend) + { + /* + * Find the last child under the previous node... + */ + + node = node->prev->last_child; + + while (node->last_child) + node = node->last_child; + + return (node); + } + else + return (node->prev); + } + else if (node->parent != top) + return (node->parent); + else + return (NULL); +} + + +/* + * End of "$Id: mxml-search.c 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-set.c b/tools/gator/daemon/mxml/mxml-set.c new file mode 100644 index 00000000..16d4bf10 --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-set.c @@ -0,0 +1,337 @@ +/* + * "$Id: mxml-set.c 451 2014-01-04 21:50:06Z msweet $" + * + * Node set functions for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include "config.h" +#include "mxml.h" + + +/* + * 'mxmlSetCDATA()' - Set the element name of a CDATA node. + * + * The node is not changed if it (or its first child) is not a CDATA element node. + * + * @since Mini-XML 2.3@ + */ + +int /* O - 0 on success, -1 on failure */ +mxmlSetCDATA(mxml_node_t *node, /* I - Node to set */ + const char *data) /* I - New data string */ +{ + /* + * Range check input... + */ + + if (node && node->type == MXML_ELEMENT && + strncmp(node->value.element.name, "![CDATA[", 8) && + node->child && node->child->type == MXML_ELEMENT && + !strncmp(node->child->value.element.name, "![CDATA[", 8)) + node = node->child; + + if (!node || node->type != MXML_ELEMENT || !data || + strncmp(node->value.element.name, "![CDATA[", 8)) + return (-1); + + /* + * Free any old element value and set the new value... + */ + + if (node->value.element.name) + free(node->value.element.name); + + node->value.element.name = _mxml_strdupf("![CDATA[%s]]", data); + + return (0); +} + + +/* + * 'mxmlSetCustom()' - Set the data and destructor of a custom data node. + * + * The node is not changed if it (or its first child) is not a custom node. + * + * @since Mini-XML 2.1@ + */ + +int /* O - 0 on success, -1 on failure */ +mxmlSetCustom( + mxml_node_t *node, /* I - Node to set */ + void *data, /* I - New data pointer */ + mxml_custom_destroy_cb_t destroy) /* I - New destructor function */ +{ + /* + * Range check input... + */ + + if (node && node->type == MXML_ELEMENT && + node->child && node->child->type == MXML_CUSTOM) + node = node->child; + + if (!node || node->type != MXML_CUSTOM) + return (-1); + + /* + * Free any old element value and set the new value... + */ + + if (node->value.custom.data && node->value.custom.destroy) + (*(node->value.custom.destroy))(node->value.custom.data); + + node->value.custom.data = data; + node->value.custom.destroy = destroy; + + return (0); +} + + +/* + * 'mxmlSetElement()' - Set the name of an element node. + * + * The node is not changed if it is not an element node. + */ + +int /* O - 0 on success, -1 on failure */ +mxmlSetElement(mxml_node_t *node, /* I - Node to set */ + const char *name) /* I - New name string */ +{ + /* + * Range check input... + */ + + if (!node || node->type != MXML_ELEMENT || !name) + return (-1); + + /* + * Free any old element value and set the new value... + */ + + if (node->value.element.name) + free(node->value.element.name); + + node->value.element.name = strdup(name); + + return (0); +} + + +/* + * 'mxmlSetInteger()' - Set the value of an integer node. + * + * The node is not changed if it (or its first child) is not an integer node. + */ + +int /* O - 0 on success, -1 on failure */ +mxmlSetInteger(mxml_node_t *node, /* I - Node to set */ + int integer) /* I - Integer value */ +{ + /* + * Range check input... + */ + + if (node && node->type == MXML_ELEMENT && + node->child && node->child->type == MXML_INTEGER) + node = node->child; + + if (!node || node->type != MXML_INTEGER) + return (-1); + + /* + * Set the new value and return... + */ + + node->value.integer = integer; + + return (0); +} + + +/* + * 'mxmlSetOpaque()' - Set the value of an opaque node. + * + * The node is not changed if it (or its first child) is not an opaque node. + */ + +int /* O - 0 on success, -1 on failure */ +mxmlSetOpaque(mxml_node_t *node, /* I - Node to set */ + const char *opaque) /* I - Opaque string */ +{ + /* + * Range check input... + */ + + if (node && node->type == MXML_ELEMENT && + node->child && node->child->type == MXML_OPAQUE) + node = node->child; + + if (!node || node->type != MXML_OPAQUE || !opaque) + return (-1); + + /* + * Free any old opaque value and set the new value... + */ + + if (node->value.opaque) + free(node->value.opaque); + + node->value.opaque = strdup(opaque); + + return (0); +} + + +/* + * 'mxmlSetReal()' - Set the value of a real number node. + * + * The node is not changed if it (or its first child) is not a real number node. + */ + +int /* O - 0 on success, -1 on failure */ +mxmlSetReal(mxml_node_t *node, /* I - Node to set */ + double real) /* I - Real number value */ +{ + /* + * Range check input... + */ + + if (node && node->type == MXML_ELEMENT && + node->child && node->child->type == MXML_REAL) + node = node->child; + + if (!node || node->type != MXML_REAL) + return (-1); + + /* + * Set the new value and return... + */ + + node->value.real = real; + + return (0); +} + + +/* + * 'mxmlSetText()' - Set the value of a text node. + * + * The node is not changed if it (or its first child) is not a text node. + */ + +int /* O - 0 on success, -1 on failure */ +mxmlSetText(mxml_node_t *node, /* I - Node to set */ + int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */ + const char *string) /* I - String */ +{ + /* + * Range check input... + */ + + if (node && node->type == MXML_ELEMENT && + node->child && node->child->type == MXML_TEXT) + node = node->child; + + if (!node || node->type != MXML_TEXT || !string) + return (-1); + + /* + * Free any old string value and set the new value... + */ + + if (node->value.text.string) + free(node->value.text.string); + + node->value.text.whitespace = whitespace; + node->value.text.string = strdup(string); + + return (0); +} + + +/* + * 'mxmlSetTextf()' - Set the value of a text node to a formatted string. + * + * The node is not changed if it (or its first child) is not a text node. + */ + +int /* O - 0 on success, -1 on failure */ +mxmlSetTextf(mxml_node_t *node, /* I - Node to set */ + int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */ + const char *format, /* I - Printf-style format string */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Pointer to arguments */ + + + /* + * Range check input... + */ + + if (node && node->type == MXML_ELEMENT && + node->child && node->child->type == MXML_TEXT) + node = node->child; + + if (!node || node->type != MXML_TEXT || !format) + return (-1); + + /* + * Free any old string value and set the new value... + */ + + if (node->value.text.string) + free(node->value.text.string); + + va_start(ap, format); + + node->value.text.whitespace = whitespace; + node->value.text.string = _mxml_strdupf(format, ap); + + va_end(ap); + + return (0); +} + + +/* + * 'mxmlSetUserData()' - Set the user data pointer for a node. + * + * @since Mini-XML 2.7@ + */ + +int /* O - 0 on success, -1 on failure */ +mxmlSetUserData(mxml_node_t *node, /* I - Node to set */ + void *data) /* I - User data pointer */ +{ + /* + * Range check input... + */ + + if (!node) + return (-1); + + /* + * Set the user data pointer and return... + */ + + node->user_data = data; + return (0); +} + + +/* + * End of "$Id: mxml-set.c 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml-string.c b/tools/gator/daemon/mxml/mxml-string.c new file mode 100644 index 00000000..9d5b58e6 --- /dev/null +++ b/tools/gator/daemon/mxml/mxml-string.c @@ -0,0 +1,469 @@ +/* + * "$Id: mxml-string.c 454 2014-01-05 03:25:07Z msweet $" + * + * String functions for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Include necessary headers... + */ + +#include "config.h" + + +/* + * The va_copy macro is part of C99, but many compilers don't implement it. + * Provide a "direct assignment" implmentation when va_copy isn't defined... + */ + +#ifndef va_copy +# ifdef __va_copy +# define va_copy(dst,src) __va_copy(dst,src) +# else +# define va_copy(dst,src) memcpy(&dst, src, sizeof(va_list)) +# endif /* __va_copy */ +#endif /* va_copy */ + + +#ifndef HAVE_SNPRINTF +/* + * '_mxml_snprintf()' - Format a string. + */ + +int /* O - Number of bytes formatted */ +_mxml_snprintf(char *buffer, /* I - Output buffer */ + size_t bufsize, /* I - Size of output buffer */ + const char *format, /* I - Printf-style format string */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Argument list */ + int bytes; /* Number of bytes formatted */ + + + va_start(ap, format); + bytes = vsnprintf(buffer, bufsize, format, ap); + va_end(ap); + + return (bytes); +} +#endif /* !HAVE_SNPRINTF */ + + +/* + * '_mxml_strdup()' - Duplicate a string. + */ + +#ifndef HAVE_STRDUP +char * /* O - New string pointer */ +_mxml_strdup(const char *s) /* I - String to duplicate */ +{ + char *t; /* New string pointer */ + + + if (s == NULL) + return (NULL); + + if ((t = malloc(strlen(s) + 1)) == NULL) + return (NULL); + + return (strcpy(t, s)); +} +#endif /* !HAVE_STRDUP */ + + +/* + * '_mxml_strdupf()' - Format and duplicate a string. + */ + +char * /* O - New string pointer */ +_mxml_strdupf(const char *format, /* I - Printf-style format string */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Pointer to additional arguments */ + char *s; /* Pointer to formatted string */ + + + /* + * Get a pointer to the additional arguments, format the string, + * and return it... + */ + + va_start(ap, format); + s = _mxml_vstrdupf(format, ap); + va_end(ap); + + return (s); +} + + +#ifndef HAVE_VSNPRINTF +/* + * '_mxml_vsnprintf()' - Format a string into a fixed size buffer. + */ + +int /* O - Number of bytes formatted */ +_mxml_vsnprintf(char *buffer, /* O - Output buffer */ + size_t bufsize, /* O - Size of output buffer */ + const char *format, /* I - Printf-style format string */ + va_list ap) /* I - Pointer to additional arguments */ +{ + char *bufptr, /* Pointer to position in buffer */ + *bufend, /* Pointer to end of buffer */ + sign, /* Sign of format width */ + size, /* Size character (h, l, L) */ + type; /* Format type character */ + int width, /* Width of field */ + prec; /* Number of characters of precision */ + char tformat[100], /* Temporary format string for sprintf() */ + *tptr, /* Pointer into temporary format */ + temp[1024]; /* Buffer for formatted numbers */ + char *s; /* Pointer to string */ + int slen; /* Length of string */ + int bytes; /* Total number of bytes needed */ + + + /* + * Loop through the format string, formatting as needed... + */ + + bufptr = buffer; + bufend = buffer + bufsize - 1; + bytes = 0; + + while (*format) + { + if (*format == '%') + { + tptr = tformat; + *tptr++ = *format++; + + if (*format == '%') + { + if (bufptr && bufptr < bufend) + *bufptr++ = *format; + bytes ++; + format ++; + continue; + } + else if (strchr(" -+#\'", *format)) + { + *tptr++ = *format; + sign = *format++; + } + else + sign = 0; + + if (*format == '*') + { + /* + * Get width from argument... + */ + + format ++; + width = va_arg(ap, int); + + snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width); + tptr += strlen(tptr); + } + else + { + width = 0; + + while (isdigit(*format & 255)) + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + width = width * 10 + *format++ - '0'; + } + } + + if (*format == '.') + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + format ++; + + if (*format == '*') + { + /* + * Get precision from argument... + */ + + format ++; + prec = va_arg(ap, int); + + snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec); + tptr += strlen(tptr); + } + else + { + prec = 0; + + while (isdigit(*format & 255)) + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + prec = prec * 10 + *format++ - '0'; + } + } + } + else + prec = -1; + + if (*format == 'l' && format[1] == 'l') + { + size = 'L'; + + if (tptr < (tformat + sizeof(tformat) - 2)) + { + *tptr++ = 'l'; + *tptr++ = 'l'; + } + + format += 2; + } + else if (*format == 'h' || *format == 'l' || *format == 'L') + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + size = *format++; + } + + if (!*format) + break; + + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + type = *format++; + *tptr = '\0'; + + switch (type) + { + case 'E' : /* Floating point formats */ + case 'G' : + case 'e' : + case 'f' : + case 'g' : + if ((width + 2) > sizeof(temp)) + break; + + sprintf(temp, tformat, va_arg(ap, double)); + + bytes += strlen(temp); + + if (bufptr) + { + if ((bufptr + strlen(temp)) > bufend) + { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } + else + { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'B' : /* Integer formats */ + case 'X' : + case 'b' : + case 'd' : + case 'i' : + case 'o' : + case 'u' : + case 'x' : + if ((width + 2) > sizeof(temp)) + break; + +#ifdef HAVE_LONG_LONG + if (size == 'L') + sprintf(temp, tformat, va_arg(ap, long long)); + else +#endif /* HAVE_LONG_LONG */ + sprintf(temp, tformat, va_arg(ap, int)); + + bytes += strlen(temp); + + if (bufptr) + { + if ((bufptr + strlen(temp)) > bufend) + { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } + else + { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'p' : /* Pointer value */ + if ((width + 2) > sizeof(temp)) + break; + + sprintf(temp, tformat, va_arg(ap, void *)); + + bytes += strlen(temp); + + if (bufptr) + { + if ((bufptr + strlen(temp)) > bufend) + { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } + else + { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'c' : /* Character or character array */ + bytes += width; + + if (bufptr) + { + if (width <= 1) + *bufptr++ = va_arg(ap, int); + else + { + if ((bufptr + width) > bufend) + width = bufend - bufptr; + + memcpy(bufptr, va_arg(ap, char *), (size_t)width); + bufptr += width; + } + } + break; + + case 's' : /* String */ + if ((s = va_arg(ap, char *)) == NULL) + s = "(null)"; + + slen = strlen(s); + if (slen > width && prec != width) + width = slen; + + bytes += width; + + if (bufptr) + { + if ((bufptr + width) > bufend) + width = bufend - bufptr; + + if (slen > width) + slen = width; + + if (sign == '-') + { + strncpy(bufptr, s, (size_t)slen); + memset(bufptr + slen, ' ', (size_t)(width - slen)); + } + else + { + memset(bufptr, ' ', (size_t)(width - slen)); + strncpy(bufptr + width - slen, s, (size_t)slen); + } + + bufptr += width; + } + break; + + case 'n' : /* Output number of chars so far */ + *(va_arg(ap, int *)) = bytes; + break; + } + } + else + { + bytes ++; + + if (bufptr && bufptr < bufend) + *bufptr++ = *format; + + format ++; + } + } + + /* + * Nul-terminate the string and return the number of characters needed. + */ + + *bufptr = '\0'; + + return (bytes); +} +#endif /* !HAVE_VSNPRINTF */ + + +/* + * '_mxml_vstrdupf()' - Format and duplicate a string. + */ + +char * /* O - New string pointer */ +_mxml_vstrdupf(const char *format, /* I - Printf-style format string */ + va_list ap) /* I - Pointer to additional arguments */ +{ + int bytes; /* Number of bytes required */ + char *buffer, /* String buffer */ + temp[256]; /* Small buffer for first vsnprintf */ + va_list apcopy; /* Copy of argument list */ + + + /* + * First format with a tiny buffer; this will tell us how many bytes are + * needed... + */ + + va_copy(apcopy, ap); + bytes = vsnprintf(temp, sizeof(temp), format, apcopy); + + if (bytes < sizeof(temp)) + { + /* + * Hey, the formatted string fits in the tiny buffer, so just dup that... + */ + + return (strdup(temp)); + } + + /* + * Allocate memory for the whole thing and reformat to the new, larger + * buffer... + */ + + if ((buffer = calloc(1, bytes + 1)) != NULL) + vsnprintf(buffer, bytes + 1, format, ap); + + /* + * Return the new string... + */ + + return (buffer); +} + + +/* + * End of "$Id: mxml-string.c 454 2014-01-05 03:25:07Z msweet $". + */ diff --git a/tools/gator/daemon/mxml/mxml.h b/tools/gator/daemon/mxml/mxml.h new file mode 100644 index 00000000..bba5fd23 --- /dev/null +++ b/tools/gator/daemon/mxml/mxml.h @@ -0,0 +1,332 @@ +/* + * "$Id: mxml.h 451 2014-01-04 21:50:06Z msweet $" + * + * Header file for Mini-XML, a small XML-like file parsing library. + * + * Copyright 2003-2014 by Michael R Sweet. + * + * These coded instructions, statements, and computer programs are the + * property of Michael R Sweet and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "COPYING" + * which should have been included with this file. If this file is + * missing or damaged, see the license at: + * + * http://www.msweet.org/projects.php/Mini-XML + */ + +/* + * Prevent multiple inclusion... + */ + +#ifndef _mxml_h_ +# define _mxml_h_ + +/* + * Include necessary headers... + */ + +# include +# include +# include +# include +# include + + +/* + * Constants... + */ + +# define MXML_MAJOR_VERSION 2 /* Major version number */ +# define MXML_MINOR_VERSION 8 /* Minor version number */ + +# define MXML_TAB 8 /* Tabs every N columns */ + +# define MXML_NO_CALLBACK 0 /* Don't use a type callback */ +# define MXML_INTEGER_CALLBACK mxml_integer_cb + /* Treat all data as integers */ +# define MXML_OPAQUE_CALLBACK mxml_opaque_cb + /* Treat all data as opaque */ +# define MXML_REAL_CALLBACK mxml_real_cb + /* Treat all data as real numbers */ +# define MXML_TEXT_CALLBACK 0 /* Treat all data as text */ +# define MXML_IGNORE_CALLBACK mxml_ignore_cb + /* Ignore all non-element content */ + +# define MXML_NO_PARENT 0 /* No parent for the node */ + +# define MXML_DESCEND 1 /* Descend when finding/walking */ +# define MXML_NO_DESCEND 0 /* Don't descend when finding/walking */ +# define MXML_DESCEND_FIRST -1 /* Descend for first find */ + +# define MXML_WS_BEFORE_OPEN 0 /* Callback for before open tag */ +# define MXML_WS_AFTER_OPEN 1 /* Callback for after open tag */ +# define MXML_WS_BEFORE_CLOSE 2 /* Callback for before close tag */ +# define MXML_WS_AFTER_CLOSE 3 /* Callback for after close tag */ + +# define MXML_ADD_BEFORE 0 /* Add node before specified node */ +# define MXML_ADD_AFTER 1 /* Add node after specified node */ +# define MXML_ADD_TO_PARENT NULL /* Add node relative to parent */ + + +/* + * Data types... + */ + +typedef enum mxml_sax_event_e /**** SAX event type. ****/ +{ + MXML_SAX_CDATA, /* CDATA node */ + MXML_SAX_COMMENT, /* Comment node */ + MXML_SAX_DATA, /* Data node */ + MXML_SAX_DIRECTIVE, /* Processing directive node */ + MXML_SAX_ELEMENT_CLOSE, /* Element closed */ + MXML_SAX_ELEMENT_OPEN /* Element opened */ +} mxml_sax_event_t; + +typedef enum mxml_type_e /**** The XML node type. ****/ +{ + MXML_IGNORE = -1, /* Ignore/throw away node @since Mini-XML 2.3@ */ + MXML_ELEMENT, /* XML element with attributes */ + MXML_INTEGER, /* Integer value */ + MXML_OPAQUE, /* Opaque string */ + MXML_REAL, /* Real value */ + MXML_TEXT, /* Text fragment */ + MXML_CUSTOM /* Custom data @since Mini-XML 2.1@ */ +} mxml_type_t; + +typedef void (*mxml_custom_destroy_cb_t)(void *); + /**** Custom data destructor ****/ + +typedef void (*mxml_error_cb_t)(const char *); + /**** Error callback function ****/ + +typedef struct mxml_attr_s /**** An XML element attribute value. @private@ ****/ +{ + char *name; /* Attribute name */ + char *value; /* Attribute value */ +} mxml_attr_t; + +typedef struct mxml_element_s /**** An XML element value. @private@ ****/ +{ + char *name; /* Name of element */ + int num_attrs; /* Number of attributes */ + mxml_attr_t *attrs; /* Attributes */ +} mxml_element_t; + +typedef struct mxml_text_s /**** An XML text value. @private@ ****/ +{ + int whitespace; /* Leading whitespace? */ + char *string; /* Fragment string */ +} mxml_text_t; + +typedef struct mxml_custom_s /**** An XML custom value. @private@ ****/ +{ + void *data; /* Pointer to (allocated) custom data */ + mxml_custom_destroy_cb_t destroy; /* Pointer to destructor function */ +} mxml_custom_t; + +typedef union mxml_value_u /**** An XML node value. @private@ ****/ +{ + mxml_element_t element; /* Element */ + int integer; /* Integer number */ + char *opaque; /* Opaque string */ + double real; /* Real number */ + mxml_text_t text; /* Text fragment */ + mxml_custom_t custom; /* Custom data @since Mini-XML 2.1@ */ +} mxml_value_t; + +struct mxml_node_s /**** An XML node. @private@ ****/ +{ + mxml_type_t type; /* Node type */ + struct mxml_node_s *next; /* Next node under same parent */ + struct mxml_node_s *prev; /* Previous node under same parent */ + struct mxml_node_s *parent; /* Parent node */ + struct mxml_node_s *child; /* First child node */ + struct mxml_node_s *last_child; /* Last child node */ + mxml_value_t value; /* Node value */ + int ref_count; /* Use count */ + void *user_data; /* User data */ +}; + +typedef struct mxml_node_s mxml_node_t; /**** An XML node. ****/ + +struct mxml_index_s /**** An XML node index. @private@ ****/ +{ + char *attr; /* Attribute used for indexing or NULL */ + int num_nodes; /* Number of nodes in index */ + int alloc_nodes; /* Allocated nodes in index */ + int cur_node; /* Current node */ + mxml_node_t **nodes; /* Node array */ +}; + +typedef struct mxml_index_s mxml_index_t; + /**** An XML node index. ****/ + +typedef int (*mxml_custom_load_cb_t)(mxml_node_t *, const char *); + /**** Custom data load callback function ****/ + +typedef char *(*mxml_custom_save_cb_t)(mxml_node_t *); + /**** Custom data save callback function ****/ + +typedef int (*mxml_entity_cb_t)(const char *); + /**** Entity callback function */ + +typedef mxml_type_t (*mxml_load_cb_t)(mxml_node_t *); + /**** Load callback function ****/ + +typedef const char *(*mxml_save_cb_t)(mxml_node_t *, int); + /**** Save callback function ****/ + +typedef void (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *); + /**** SAX callback function ****/ + + +/* + * C++ support... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +/* + * Prototypes... + */ + +extern void mxmlAdd(mxml_node_t *parent, int where, + mxml_node_t *child, mxml_node_t *node); +extern void mxmlDelete(mxml_node_t *node); +extern void mxmlElementDeleteAttr(mxml_node_t *node, + const char *name); +extern const char *mxmlElementGetAttr(mxml_node_t *node, const char *name); +extern void mxmlElementSetAttr(mxml_node_t *node, const char *name, + const char *value); +extern void mxmlElementSetAttrf(mxml_node_t *node, const char *name, + const char *format, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 3, 4))) +# endif /* __GNUC__ */ +; +extern int mxmlEntityAddCallback(mxml_entity_cb_t cb); +extern const char *mxmlEntityGetName(int val); +extern int mxmlEntityGetValue(const char *name); +extern void mxmlEntityRemoveCallback(mxml_entity_cb_t cb); +extern mxml_node_t *mxmlFindElement(mxml_node_t *node, mxml_node_t *top, + const char *name, const char *attr, + const char *value, int descend); +extern mxml_node_t *mxmlFindPath(mxml_node_t *node, const char *path); +extern const char *mxmlGetCDATA(mxml_node_t *node); +extern const void *mxmlGetCustom(mxml_node_t *node); +extern const char *mxmlGetElement(mxml_node_t *node); +extern mxml_node_t *mxmlGetFirstChild(mxml_node_t *node); +extern int mxmlGetInteger(mxml_node_t *node); +extern mxml_node_t *mxmlGetLastChild(mxml_node_t *node); +extern mxml_node_t *mxmlGetNextSibling(mxml_node_t *node); +extern const char *mxmlGetOpaque(mxml_node_t *node); +extern mxml_node_t *mxmlGetParent(mxml_node_t *node); +extern mxml_node_t *mxmlGetPrevSibling(mxml_node_t *node); +extern double mxmlGetReal(mxml_node_t *node); +extern int mxmlGetRefCount(mxml_node_t *node); +extern const char *mxmlGetText(mxml_node_t *node, int *whitespace); +extern mxml_type_t mxmlGetType(mxml_node_t *node); +extern void *mxmlGetUserData(mxml_node_t *node); +extern void mxmlIndexDelete(mxml_index_t *ind); +extern mxml_node_t *mxmlIndexEnum(mxml_index_t *ind); +extern mxml_node_t *mxmlIndexFind(mxml_index_t *ind, + const char *element, + const char *value); +extern int mxmlIndexGetCount(mxml_index_t *ind); +extern mxml_index_t *mxmlIndexNew(mxml_node_t *node, const char *element, + const char *attr); +extern mxml_node_t *mxmlIndexReset(mxml_index_t *ind); +extern mxml_node_t *mxmlLoadFd(mxml_node_t *top, int fd, + mxml_type_t (*cb)(mxml_node_t *)); +extern mxml_node_t *mxmlLoadFile(mxml_node_t *top, FILE *fp, + mxml_type_t (*cb)(mxml_node_t *)); +extern mxml_node_t *mxmlLoadString(mxml_node_t *top, const char *s, + mxml_type_t (*cb)(mxml_node_t *)); +extern mxml_node_t *mxmlNewCDATA(mxml_node_t *parent, const char *string); +extern mxml_node_t *mxmlNewCustom(mxml_node_t *parent, void *data, + mxml_custom_destroy_cb_t destroy); +extern mxml_node_t *mxmlNewElement(mxml_node_t *parent, const char *name); +extern mxml_node_t *mxmlNewInteger(mxml_node_t *parent, int integer); +extern mxml_node_t *mxmlNewOpaque(mxml_node_t *parent, const char *opaque); +extern mxml_node_t *mxmlNewReal(mxml_node_t *parent, double real); +extern mxml_node_t *mxmlNewText(mxml_node_t *parent, int whitespace, + const char *string); +extern mxml_node_t *mxmlNewTextf(mxml_node_t *parent, int whitespace, + const char *format, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 3, 4))) +# endif /* __GNUC__ */ +; +extern mxml_node_t *mxmlNewXML(const char *version); +extern int mxmlRelease(mxml_node_t *node); +extern void mxmlRemove(mxml_node_t *node); +extern int mxmlRetain(mxml_node_t *node); +extern char *mxmlSaveAllocString(mxml_node_t *node, + mxml_save_cb_t cb); +extern int mxmlSaveFd(mxml_node_t *node, int fd, + mxml_save_cb_t cb); +extern int mxmlSaveFile(mxml_node_t *node, FILE *fp, + mxml_save_cb_t cb); +extern int mxmlSaveString(mxml_node_t *node, char *buffer, + int bufsize, mxml_save_cb_t cb); +extern mxml_node_t *mxmlSAXLoadFd(mxml_node_t *top, int fd, + mxml_type_t (*cb)(mxml_node_t *), + mxml_sax_cb_t sax, void *sax_data); +extern mxml_node_t *mxmlSAXLoadFile(mxml_node_t *top, FILE *fp, + mxml_type_t (*cb)(mxml_node_t *), + mxml_sax_cb_t sax, void *sax_data); +extern mxml_node_t *mxmlSAXLoadString(mxml_node_t *top, const char *s, + mxml_type_t (*cb)(mxml_node_t *), + mxml_sax_cb_t sax, void *sax_data); +extern int mxmlSetCDATA(mxml_node_t *node, const char *data); +extern int mxmlSetCustom(mxml_node_t *node, void *data, + mxml_custom_destroy_cb_t destroy); +extern void mxmlSetCustomHandlers(mxml_custom_load_cb_t load, + mxml_custom_save_cb_t save); +extern int mxmlSetElement(mxml_node_t *node, const char *name); +extern void mxmlSetErrorCallback(mxml_error_cb_t cb); +extern int mxmlSetInteger(mxml_node_t *node, int integer); +extern int mxmlSetOpaque(mxml_node_t *node, const char *opaque); +extern int mxmlSetReal(mxml_node_t *node, double real); +extern int mxmlSetText(mxml_node_t *node, int whitespace, + const char *string); +extern int mxmlSetTextf(mxml_node_t *node, int whitespace, + const char *format, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 3, 4))) +# endif /* __GNUC__ */ +; +extern int mxmlSetUserData(mxml_node_t *node, void *data); +extern void mxmlSetWrapMargin(int column); +extern mxml_node_t *mxmlWalkNext(mxml_node_t *node, mxml_node_t *top, + int descend); +extern mxml_node_t *mxmlWalkPrev(mxml_node_t *node, mxml_node_t *top, + int descend); + + +/* + * Semi-private functions... + */ + +extern void mxml_error(const char *format, ...); +extern mxml_type_t mxml_ignore_cb(mxml_node_t *node); +extern mxml_type_t mxml_integer_cb(mxml_node_t *node); +extern mxml_type_t mxml_opaque_cb(mxml_node_t *node); +extern mxml_type_t mxml_real_cb(mxml_node_t *node); + + +/* + * C++ support... + */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_mxml_h_ */ + + +/* + * End of "$Id: mxml.h 451 2014-01-04 21:50:06Z msweet $". + */ diff --git a/tools/hv/hv_get_dhcp_info.sh b/tools/hv/hv_get_dhcp_info.sh new file mode 100755 index 00000000..ccd3e953 --- /dev/null +++ b/tools/hv/hv_get_dhcp_info.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# This example script retrieves the DHCP state of a given interface. +# In the interest of keeping the KVP daemon code free of distro specific +# information; the kvp daemon code invokes this external script to gather +# DHCP setting for the specific interface. +# +# Input: Name of the interface +# +# Output: The script prints the string "Enabled" to stdout to indicate +# that DHCP is enabled on the interface. If DHCP is not enabled, +# the script prints the string "Disabled" to stdout. +# +# Each Distro is expected to implement this script in a distro specific +# fashion. For instance on Distros that ship with Network Manager enabled, +# this script can be based on the Network Manager APIs for retrieving DHCP +# information. + +if_file="/etc/sysconfig/network-scripts/ifcfg-"$1 + +dhcp=$(grep "dhcp" $if_file 2>/dev/null) + +if [ "$dhcp" != "" ]; +then +echo "Enabled" +else +echo "Disabled" +fi diff --git a/tools/hv/hv_get_dns_info.sh b/tools/hv/hv_get_dns_info.sh new file mode 100755 index 00000000..058c17b4 --- /dev/null +++ b/tools/hv/hv_get_dns_info.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# This example script parses /etc/resolv.conf to retrive DNS information. +# In the interest of keeping the KVP daemon code free of distro specific +# information; the kvp daemon code invokes this external script to gather +# DNS information. +# This script is expected to print the nameserver values to stdout. +# Each Distro is expected to implement this script in a distro specific +# fashion. For instance on Distros that ship with Network Manager enabled, +# this script can be based on the Network Manager APIs for retrieving DNS +# entries. + +cat /etc/resolv.conf 2>/dev/null | awk '/^nameserver/ { print $2 }' diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c new file mode 100644 index 00000000..274e1786 --- /dev/null +++ b/tools/hv/hv_kvp_daemon.c @@ -0,0 +1,1704 @@ +/* + * An implementation of key value pair (KVP) functionality for Linux. + * + * + * Copyright (C) 2010, Novell, Inc. + * Author : K. Y. Srinivasan + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + * 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, GOOD TITLE or + * NON INFRINGEMENT. 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 St, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * KVP protocol: The user mode component first registers with the + * the kernel component. Subsequently, the kernel component requests, data + * for the specified keys. In response to this message the user mode component + * fills in the value corresponding to the specified key. We overload the + * sequence field in the cn_msg header to define our KVP message types. + * + * We use this infrastructure for also supporting queries from user mode + * application for state that may be maintained in the KVP kernel component. + * + */ + + +enum key_index { + FullyQualifiedDomainName = 0, + IntegrationServicesVersion, /*This key is serviced in the kernel*/ + NetworkAddressIPv4, + NetworkAddressIPv6, + OSBuildNumber, + OSName, + OSMajorVersion, + OSMinorVersion, + OSVersion, + ProcessorArchitecture +}; + + +enum { + IPADDR = 0, + NETMASK, + GATEWAY, + DNS +}; + +static char kvp_send_buffer[4096]; +static char kvp_recv_buffer[4096 * 2]; +static struct sockaddr_nl addr; +static int in_hand_shake = 1; + +static char *os_name = ""; +static char *os_major = ""; +static char *os_minor = ""; +static char *processor_arch; +static char *os_build; +static char *os_version; +static char *lic_version = "Unknown version"; +static struct utsname uts_buf; + +/* + * The location of the interface configuration file. + */ + +#define KVP_CONFIG_LOC "/var/lib/hyperv" + +#define MAX_FILE_NAME 100 +#define ENTRIES_PER_BLOCK 50 + +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + +struct kvp_record { + char key[HV_KVP_EXCHANGE_MAX_KEY_SIZE]; + char value[HV_KVP_EXCHANGE_MAX_VALUE_SIZE]; +}; + +struct kvp_file_state { + int fd; + int num_blocks; + struct kvp_record *records; + int num_records; + char fname[MAX_FILE_NAME]; +}; + +static struct kvp_file_state kvp_file_info[KVP_POOL_COUNT]; + +static void kvp_acquire_lock(int pool) +{ + struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0}; + fl.l_pid = getpid(); + + if (fcntl(kvp_file_info[pool].fd, F_SETLKW, &fl) == -1) { + syslog(LOG_ERR, "Failed to acquire the lock pool: %d", pool); + exit(EXIT_FAILURE); + } +} + +static void kvp_release_lock(int pool) +{ + struct flock fl = {F_UNLCK, SEEK_SET, 0, 0, 0}; + fl.l_pid = getpid(); + + if (fcntl(kvp_file_info[pool].fd, F_SETLK, &fl) == -1) { + perror("fcntl"); + syslog(LOG_ERR, "Failed to release the lock pool: %d", pool); + exit(EXIT_FAILURE); + } +} + +static void kvp_update_file(int pool) +{ + FILE *filep; + size_t bytes_written; + + /* + * We are going to write our in-memory registry out to + * disk; acquire the lock first. + */ + kvp_acquire_lock(pool); + + filep = fopen(kvp_file_info[pool].fname, "we"); + if (!filep) { + kvp_release_lock(pool); + syslog(LOG_ERR, "Failed to open file, pool: %d", pool); + exit(EXIT_FAILURE); + } + + bytes_written = fwrite(kvp_file_info[pool].records, + sizeof(struct kvp_record), + kvp_file_info[pool].num_records, filep); + + if (ferror(filep) || fclose(filep)) { + kvp_release_lock(pool); + syslog(LOG_ERR, "Failed to write file, pool: %d", pool); + exit(EXIT_FAILURE); + } + + kvp_release_lock(pool); +} + +static void kvp_update_mem_state(int pool) +{ + FILE *filep; + size_t records_read = 0; + struct kvp_record *record = kvp_file_info[pool].records; + struct kvp_record *readp; + int num_blocks = kvp_file_info[pool].num_blocks; + int alloc_unit = sizeof(struct kvp_record) * ENTRIES_PER_BLOCK; + + kvp_acquire_lock(pool); + + filep = fopen(kvp_file_info[pool].fname, "re"); + if (!filep) { + kvp_release_lock(pool); + syslog(LOG_ERR, "Failed to open file, pool: %d", pool); + exit(EXIT_FAILURE); + } + for (;;) { + readp = &record[records_read]; + records_read += fread(readp, sizeof(struct kvp_record), + ENTRIES_PER_BLOCK * num_blocks, + filep); + + if (ferror(filep)) { + syslog(LOG_ERR, "Failed to read file, pool: %d", pool); + exit(EXIT_FAILURE); + } + + if (!feof(filep)) { + /* + * We have more data to read. + */ + num_blocks++; + record = realloc(record, alloc_unit * num_blocks); + + if (record == NULL) { + syslog(LOG_ERR, "malloc failed"); + exit(EXIT_FAILURE); + } + continue; + } + break; + } + + kvp_file_info[pool].num_blocks = num_blocks; + kvp_file_info[pool].records = record; + kvp_file_info[pool].num_records = records_read; + + fclose(filep); + kvp_release_lock(pool); +} +static int kvp_file_init(void) +{ + int fd; + FILE *filep; + size_t records_read; + char *fname; + struct kvp_record *record; + struct kvp_record *readp; + int num_blocks; + int i; + int alloc_unit = sizeof(struct kvp_record) * ENTRIES_PER_BLOCK; + + if (access(KVP_CONFIG_LOC, F_OK)) { + if (mkdir(KVP_CONFIG_LOC, 0755 /* rwxr-xr-x */)) { + syslog(LOG_ERR, " Failed to create %s", KVP_CONFIG_LOC); + exit(EXIT_FAILURE); + } + } + + for (i = 0; i < KVP_POOL_COUNT; i++) { + fname = kvp_file_info[i].fname; + records_read = 0; + num_blocks = 1; + sprintf(fname, "%s/.kvp_pool_%d", KVP_CONFIG_LOC, i); + fd = open(fname, O_RDWR | O_CREAT | O_CLOEXEC, 0644 /* rw-r--r-- */); + + if (fd == -1) + return 1; + + + filep = fopen(fname, "re"); + if (!filep) + return 1; + + record = malloc(alloc_unit * num_blocks); + if (record == NULL) { + fclose(filep); + return 1; + } + for (;;) { + readp = &record[records_read]; + records_read += fread(readp, sizeof(struct kvp_record), + ENTRIES_PER_BLOCK, + filep); + + if (ferror(filep)) { + syslog(LOG_ERR, "Failed to read file, pool: %d", + i); + exit(EXIT_FAILURE); + } + + if (!feof(filep)) { + /* + * We have more data to read. + */ + num_blocks++; + record = realloc(record, alloc_unit * + num_blocks); + if (record == NULL) { + fclose(filep); + return 1; + } + continue; + } + break; + } + kvp_file_info[i].fd = fd; + kvp_file_info[i].num_blocks = num_blocks; + kvp_file_info[i].records = record; + kvp_file_info[i].num_records = records_read; + fclose(filep); + + } + + return 0; +} + +static int kvp_key_delete(int pool, const char *key, int key_size) +{ + int i; + int j, k; + int num_records; + struct kvp_record *record; + + /* + * First update the in-memory state. + */ + kvp_update_mem_state(pool); + + num_records = kvp_file_info[pool].num_records; + record = kvp_file_info[pool].records; + + for (i = 0; i < num_records; i++) { + if (memcmp(key, record[i].key, key_size)) + continue; + /* + * Found a match; just move the remaining + * entries up. + */ + if (i == num_records) { + kvp_file_info[pool].num_records--; + kvp_update_file(pool); + return 0; + } + + j = i; + k = j + 1; + for (; k < num_records; k++) { + strcpy(record[j].key, record[k].key); + strcpy(record[j].value, record[k].value); + j++; + } + + kvp_file_info[pool].num_records--; + kvp_update_file(pool); + return 0; + } + return 1; +} + +static int kvp_key_add_or_modify(int pool, const char *key, int key_size, const char *value, + int value_size) +{ + int i; + int num_records; + struct kvp_record *record; + int num_blocks; + + if ((key_size > HV_KVP_EXCHANGE_MAX_KEY_SIZE) || + (value_size > HV_KVP_EXCHANGE_MAX_VALUE_SIZE)) + return 1; + + /* + * First update the in-memory state. + */ + kvp_update_mem_state(pool); + + num_records = kvp_file_info[pool].num_records; + record = kvp_file_info[pool].records; + num_blocks = kvp_file_info[pool].num_blocks; + + for (i = 0; i < num_records; i++) { + if (memcmp(key, record[i].key, key_size)) + continue; + /* + * Found a match; just update the value - + * this is the modify case. + */ + memcpy(record[i].value, value, value_size); + kvp_update_file(pool); + return 0; + } + + /* + * Need to add a new entry; + */ + if (num_records == (ENTRIES_PER_BLOCK * num_blocks)) { + /* Need to allocate a larger array for reg entries. */ + record = realloc(record, sizeof(struct kvp_record) * + ENTRIES_PER_BLOCK * (num_blocks + 1)); + + if (record == NULL) + return 1; + kvp_file_info[pool].num_blocks++; + + } + memcpy(record[i].value, value, value_size); + memcpy(record[i].key, key, key_size); + kvp_file_info[pool].records = record; + kvp_file_info[pool].num_records++; + kvp_update_file(pool); + return 0; +} + +static int kvp_get_value(int pool, const char *key, int key_size, char *value, + int value_size) +{ + int i; + int num_records; + struct kvp_record *record; + + if ((key_size > HV_KVP_EXCHANGE_MAX_KEY_SIZE) || + (value_size > HV_KVP_EXCHANGE_MAX_VALUE_SIZE)) + return 1; + + /* + * First update the in-memory state. + */ + kvp_update_mem_state(pool); + + num_records = kvp_file_info[pool].num_records; + record = kvp_file_info[pool].records; + + for (i = 0; i < num_records; i++) { + if (memcmp(key, record[i].key, key_size)) + continue; + /* + * Found a match; just copy the value out. + */ + memcpy(value, record[i].value, value_size); + return 0; + } + + return 1; +} + +static int kvp_pool_enumerate(int pool, int index, char *key, int key_size, + char *value, int value_size) +{ + struct kvp_record *record; + + /* + * First update our in-memory database. + */ + kvp_update_mem_state(pool); + record = kvp_file_info[pool].records; + + if (index >= kvp_file_info[pool].num_records) { + return 1; + } + + memcpy(key, record[index].key, key_size); + memcpy(value, record[index].value, value_size); + return 0; +} + + +void kvp_get_os_info(void) +{ + FILE *file; + char *p, buf[512]; + + uname(&uts_buf); + os_version = uts_buf.release; + os_build = strdup(uts_buf.release); + + os_name = uts_buf.sysname; + processor_arch = uts_buf.machine; + + /* + * The current windows host (win7) expects the build + * string to be of the form: x.y.z + * Strip additional information we may have. + */ + p = strchr(os_version, '-'); + if (p) + *p = '\0'; + + /* + * Parse the /etc/os-release file if present: + * http://www.freedesktop.org/software/systemd/man/os-release.html + */ + file = fopen("/etc/os-release", "r"); + if (file != NULL) { + while (fgets(buf, sizeof(buf), file)) { + char *value, *q; + + /* Ignore comments */ + if (buf[0] == '#') + continue; + + /* Split into name=value */ + p = strchr(buf, '='); + if (!p) + continue; + *p++ = 0; + + /* Remove quotes and newline; un-escape */ + value = p; + q = p; + while (*p) { + if (*p == '\\') { + ++p; + if (!*p) + break; + *q++ = *p++; + } else if (*p == '\'' || *p == '"' || + *p == '\n') { + ++p; + } else { + *q++ = *p++; + } + } + *q = 0; + + if (!strcmp(buf, "NAME")) { + p = strdup(value); + if (!p) + break; + os_name = p; + } else if (!strcmp(buf, "VERSION_ID")) { + p = strdup(value); + if (!p) + break; + os_major = p; + } + } + fclose(file); + return; + } + + /* Fallback for older RH/SUSE releases */ + file = fopen("/etc/SuSE-release", "r"); + if (file != NULL) + goto kvp_osinfo_found; + file = fopen("/etc/redhat-release", "r"); + if (file != NULL) + goto kvp_osinfo_found; + + /* + * We don't have information about the os. + */ + return; + +kvp_osinfo_found: + /* up to three lines */ + p = fgets(buf, sizeof(buf), file); + if (p) { + p = strchr(buf, '\n'); + if (p) + *p = '\0'; + p = strdup(buf); + if (!p) + goto done; + os_name = p; + + /* second line */ + p = fgets(buf, sizeof(buf), file); + if (p) { + p = strchr(buf, '\n'); + if (p) + *p = '\0'; + p = strdup(buf); + if (!p) + goto done; + os_major = p; + + /* third line */ + p = fgets(buf, sizeof(buf), file); + if (p) { + p = strchr(buf, '\n'); + if (p) + *p = '\0'; + p = strdup(buf); + if (p) + os_minor = p; + } + } + } + +done: + fclose(file); + return; +} + + + +/* + * Retrieve an interface name corresponding to the specified guid. + * If there is a match, the function returns a pointer + * to the interface name and if not, a NULL is returned. + * If a match is found, the caller is responsible for + * freeing the memory. + */ + +static char *kvp_get_if_name(char *guid) +{ + DIR *dir; + struct dirent *entry; + FILE *file; + char *p, *q, *x; + char *if_name = NULL; + char buf[256]; + char *kvp_net_dir = "/sys/class/net/"; + char dev_id[256]; + + dir = opendir(kvp_net_dir); + if (dir == NULL) + return NULL; + + snprintf(dev_id, sizeof(dev_id), "%s", kvp_net_dir); + q = dev_id + strlen(kvp_net_dir); + + while ((entry = readdir(dir)) != NULL) { + /* + * Set the state for the next pass. + */ + *q = '\0'; + strcat(dev_id, entry->d_name); + strcat(dev_id, "/device/device_id"); + + file = fopen(dev_id, "r"); + if (file == NULL) + continue; + + p = fgets(buf, sizeof(buf), file); + if (p) { + x = strchr(p, '\n'); + if (x) + *x = '\0'; + + if (!strcmp(p, guid)) { + /* + * Found the guid match; return the interface + * name. The caller will free the memory. + */ + if_name = strdup(entry->d_name); + fclose(file); + break; + } + } + fclose(file); + } + + closedir(dir); + return if_name; +} + +/* + * Retrieve the MAC address given the interface name. + */ + +static char *kvp_if_name_to_mac(char *if_name) +{ + FILE *file; + char *p, *x; + char buf[256]; + char addr_file[256]; + int i; + char *mac_addr = NULL; + + snprintf(addr_file, sizeof(addr_file), "%s%s%s", "/sys/class/net/", + if_name, "/address"); + + file = fopen(addr_file, "r"); + if (file == NULL) + return NULL; + + p = fgets(buf, sizeof(buf), file); + if (p) { + x = strchr(p, '\n'); + if (x) + *x = '\0'; + for (i = 0; i < strlen(p); i++) + p[i] = toupper(p[i]); + mac_addr = strdup(p); + } + + fclose(file); + return mac_addr; +} + + +/* + * Retrieve the interface name given tha MAC address. + */ + +static char *kvp_mac_to_if_name(char *mac) +{ + DIR *dir; + struct dirent *entry; + FILE *file; + char *p, *q, *x; + char *if_name = NULL; + char buf[256]; + char *kvp_net_dir = "/sys/class/net/"; + char dev_id[256]; + int i; + + dir = opendir(kvp_net_dir); + if (dir == NULL) + return NULL; + + snprintf(dev_id, sizeof(dev_id), kvp_net_dir); + q = dev_id + strlen(kvp_net_dir); + + while ((entry = readdir(dir)) != NULL) { + /* + * Set the state for the next pass. + */ + *q = '\0'; + + strcat(dev_id, entry->d_name); + strcat(dev_id, "/address"); + + file = fopen(dev_id, "r"); + if (file == NULL) + continue; + + p = fgets(buf, sizeof(buf), file); + if (p) { + x = strchr(p, '\n'); + if (x) + *x = '\0'; + + for (i = 0; i < strlen(p); i++) + p[i] = toupper(p[i]); + + if (!strcmp(p, mac)) { + /* + * Found the MAC match; return the interface + * name. The caller will free the memory. + */ + if_name = strdup(entry->d_name); + fclose(file); + break; + } + } + fclose(file); + } + + closedir(dir); + return if_name; +} + + +static void kvp_process_ipconfig_file(char *cmd, + char *config_buf, int len, + int element_size, int offset) +{ + char buf[256]; + char *p; + char *x; + FILE *file; + + /* + * First execute the command. + */ + file = popen(cmd, "r"); + if (file == NULL) + return; + + if (offset == 0) + memset(config_buf, 0, len); + while ((p = fgets(buf, sizeof(buf), file)) != NULL) { + if ((len - strlen(config_buf)) < (element_size + 1)) + break; + + x = strchr(p, '\n'); + *x = '\0'; + strcat(config_buf, p); + strcat(config_buf, ";"); + } + pclose(file); +} + +static void kvp_get_ipconfig_info(char *if_name, + struct hv_kvp_ipaddr_value *buffer) +{ + char cmd[512]; + char dhcp_info[128]; + char *p; + FILE *file; + + /* + * Get the address of default gateway (ipv4). + */ + sprintf(cmd, "%s %s", "ip route show dev", if_name); + strcat(cmd, " | awk '/default/ {print $3 }'"); + + /* + * Execute the command to gather gateway info. + */ + kvp_process_ipconfig_file(cmd, (char *)buffer->gate_way, + (MAX_GATEWAY_SIZE * 2), INET_ADDRSTRLEN, 0); + + /* + * Get the address of default gateway (ipv6). + */ + sprintf(cmd, "%s %s", "ip -f inet6 route show dev", if_name); + strcat(cmd, " | awk '/default/ {print $3 }'"); + + /* + * Execute the command to gather gateway info (ipv6). + */ + kvp_process_ipconfig_file(cmd, (char *)buffer->gate_way, + (MAX_GATEWAY_SIZE * 2), INET6_ADDRSTRLEN, 1); + + + /* + * Gather the DNS state. + * Since there is no standard way to get this information + * across various distributions of interest; we just invoke + * an external script that needs to be ported across distros + * of interest. + * + * Following is the expected format of the information from the script: + * + * ipaddr1 (nameserver1) + * ipaddr2 (nameserver2) + * . + * . + */ + + sprintf(cmd, "%s", "hv_get_dns_info"); + + /* + * Execute the command to gather DNS info. + */ + kvp_process_ipconfig_file(cmd, (char *)buffer->dns_addr, + (MAX_IP_ADDR_SIZE * 2), INET_ADDRSTRLEN, 0); + + /* + * Gather the DHCP state. + * We will gather this state by invoking an external script. + * The parameter to the script is the interface name. + * Here is the expected output: + * + * Enabled: DHCP enabled. + */ + + sprintf(cmd, "%s %s", "hv_get_dhcp_info", if_name); + + file = popen(cmd, "r"); + if (file == NULL) + return; + + p = fgets(dhcp_info, sizeof(dhcp_info), file); + if (p == NULL) { + pclose(file); + return; + } + + if (!strncmp(p, "Enabled", 7)) + buffer->dhcp_enabled = 1; + else + buffer->dhcp_enabled = 0; + + pclose(file); +} + + +static unsigned int hweight32(unsigned int *w) +{ + unsigned int res = *w - ((*w >> 1) & 0x55555555); + res = (res & 0x33333333) + ((res >> 2) & 0x33333333); + res = (res + (res >> 4)) & 0x0F0F0F0F; + res = res + (res >> 8); + return (res + (res >> 16)) & 0x000000FF; +} + +static int kvp_process_ip_address(void *addrp, + int family, char *buffer, + int length, int *offset) +{ + struct sockaddr_in *addr; + struct sockaddr_in6 *addr6; + int addr_length; + char tmp[50]; + const char *str; + + if (family == AF_INET) { + addr = (struct sockaddr_in *)addrp; + str = inet_ntop(family, &addr->sin_addr, tmp, 50); + addr_length = INET_ADDRSTRLEN; + } else { + addr6 = (struct sockaddr_in6 *)addrp; + str = inet_ntop(family, &addr6->sin6_addr.s6_addr, tmp, 50); + addr_length = INET6_ADDRSTRLEN; + } + + if ((length - *offset) < addr_length + 2) + return HV_E_FAIL; + if (str == NULL) { + strcpy(buffer, "inet_ntop failed\n"); + return HV_E_FAIL; + } + if (*offset == 0) + strcpy(buffer, tmp); + else { + strcat(buffer, ";"); + strcat(buffer, tmp); + } + + *offset += strlen(str) + 1; + + return 0; +} + +static int +kvp_get_ip_info(int family, char *if_name, int op, + void *out_buffer, int length) +{ + struct ifaddrs *ifap; + struct ifaddrs *curp; + int offset = 0; + int sn_offset = 0; + int error = 0; + char *buffer; + struct hv_kvp_ipaddr_value *ip_buffer; + char cidr_mask[5]; /* /xyz */ + int weight; + int i; + unsigned int *w; + char *sn_str; + struct sockaddr_in6 *addr6; + + if (op == KVP_OP_ENUMERATE) { + buffer = out_buffer; + } else { + ip_buffer = out_buffer; + buffer = (char *)ip_buffer->ip_addr; + ip_buffer->addr_family = 0; + } + /* + * On entry into this function, the buffer is capable of holding the + * maximum key value. + */ + + if (getifaddrs(&ifap)) { + strcpy(buffer, "getifaddrs failed\n"); + return HV_E_FAIL; + } + + curp = ifap; + while (curp != NULL) { + if (curp->ifa_addr == NULL) { + curp = curp->ifa_next; + continue; + } + + if ((if_name != NULL) && + (strncmp(curp->ifa_name, if_name, strlen(if_name)))) { + /* + * We want info about a specific interface; + * just continue. + */ + curp = curp->ifa_next; + continue; + } + + /* + * We only support two address families: AF_INET and AF_INET6. + * If a family value of 0 is specified, we collect both + * supported address families; if not we gather info on + * the specified address family. + */ + if ((((family != 0) && + (curp->ifa_addr->sa_family != family))) || + (curp->ifa_flags & IFF_LOOPBACK)) { + curp = curp->ifa_next; + continue; + } + if ((curp->ifa_addr->sa_family != AF_INET) && + (curp->ifa_addr->sa_family != AF_INET6)) { + curp = curp->ifa_next; + continue; + } + + if (op == KVP_OP_GET_IP_INFO) { + /* + * Gather info other than the IP address. + * IP address info will be gathered later. + */ + if (curp->ifa_addr->sa_family == AF_INET) { + ip_buffer->addr_family |= ADDR_FAMILY_IPV4; + /* + * Get subnet info. + */ + error = kvp_process_ip_address( + curp->ifa_netmask, + AF_INET, + (char *) + ip_buffer->sub_net, + length, + &sn_offset); + if (error) + goto gather_ipaddr; + } else { + ip_buffer->addr_family |= ADDR_FAMILY_IPV6; + + /* + * Get subnet info in CIDR format. + */ + weight = 0; + sn_str = (char *)ip_buffer->sub_net; + addr6 = (struct sockaddr_in6 *) + curp->ifa_netmask; + w = addr6->sin6_addr.s6_addr32; + + for (i = 0; i < 4; i++) + weight += hweight32(&w[i]); + + sprintf(cidr_mask, "/%d", weight); + if ((length - sn_offset) < + (strlen(cidr_mask) + 1)) + goto gather_ipaddr; + + if (sn_offset == 0) + strcpy(sn_str, cidr_mask); + else { + strcat((char *)ip_buffer->sub_net, ";"); + strcat(sn_str, cidr_mask); + } + sn_offset += strlen(sn_str) + 1; + } + + /* + * Collect other ip related configuration info. + */ + + kvp_get_ipconfig_info(if_name, ip_buffer); + } + +gather_ipaddr: + error = kvp_process_ip_address(curp->ifa_addr, + curp->ifa_addr->sa_family, + buffer, + length, &offset); + if (error) + goto getaddr_done; + + curp = curp->ifa_next; + } + +getaddr_done: + freeifaddrs(ifap); + return error; +} + + +static int expand_ipv6(char *addr, int type) +{ + int ret; + struct in6_addr v6_addr; + + ret = inet_pton(AF_INET6, addr, &v6_addr); + + if (ret != 1) { + if (type == NETMASK) + return 1; + return 0; + } + + sprintf(addr, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:" + "%02x%02x:%02x%02x:%02x%02x", + (int)v6_addr.s6_addr[0], (int)v6_addr.s6_addr[1], + (int)v6_addr.s6_addr[2], (int)v6_addr.s6_addr[3], + (int)v6_addr.s6_addr[4], (int)v6_addr.s6_addr[5], + (int)v6_addr.s6_addr[6], (int)v6_addr.s6_addr[7], + (int)v6_addr.s6_addr[8], (int)v6_addr.s6_addr[9], + (int)v6_addr.s6_addr[10], (int)v6_addr.s6_addr[11], + (int)v6_addr.s6_addr[12], (int)v6_addr.s6_addr[13], + (int)v6_addr.s6_addr[14], (int)v6_addr.s6_addr[15]); + + return 1; + +} + +static int is_ipv4(char *addr) +{ + int ret; + struct in_addr ipv4_addr; + + ret = inet_pton(AF_INET, addr, &ipv4_addr); + + if (ret == 1) + return 1; + return 0; +} + +static int parse_ip_val_buffer(char *in_buf, int *offset, + char *out_buf, int out_len) +{ + char *x; + char *start; + + /* + * in_buf has sequence of characters that are seperated by + * the character ';'. The last sequence does not have the + * terminating ";" character. + */ + start = in_buf + *offset; + + x = strchr(start, ';'); + if (x) + *x = 0; + else + x = start + strlen(start); + + if (strlen(start) != 0) { + int i = 0; + /* + * Get rid of leading spaces. + */ + while (start[i] == ' ') + i++; + + if ((x - start) <= out_len) { + strcpy(out_buf, (start + i)); + *offset += (x - start) + 1; + return 1; + } + } + return 0; +} + +static int kvp_write_file(FILE *f, char *s1, char *s2, char *s3) +{ + int ret; + + ret = fprintf(f, "%s%s%s%s\n", s1, s2, "=", s3); + + if (ret < 0) + return HV_E_FAIL; + + return 0; +} + + +static int process_ip_string(FILE *f, char *ip_string, int type) +{ + int error = 0; + char addr[INET6_ADDRSTRLEN]; + int i = 0; + int j = 0; + char str[256]; + char sub_str[10]; + int offset = 0; + + memset(addr, 0, sizeof(addr)); + + while (parse_ip_val_buffer(ip_string, &offset, addr, + (MAX_IP_ADDR_SIZE * 2))) { + + sub_str[0] = 0; + if (is_ipv4(addr)) { + switch (type) { + case IPADDR: + snprintf(str, sizeof(str), "%s", "IPADDR"); + break; + case NETMASK: + snprintf(str, sizeof(str), "%s", "NETMASK"); + break; + case GATEWAY: + snprintf(str, sizeof(str), "%s", "GATEWAY"); + break; + case DNS: + snprintf(str, sizeof(str), "%s", "DNS"); + break; + } + + if (type == DNS) { + snprintf(sub_str, sizeof(sub_str), "%d", ++i); + } else if (type == GATEWAY && i == 0) { + ++i; + } else { + snprintf(sub_str, sizeof(sub_str), "%d", i++); + } + + + } else if (expand_ipv6(addr, type)) { + switch (type) { + case IPADDR: + snprintf(str, sizeof(str), "%s", "IPV6ADDR"); + break; + case NETMASK: + snprintf(str, sizeof(str), "%s", "IPV6NETMASK"); + break; + case GATEWAY: + snprintf(str, sizeof(str), "%s", + "IPV6_DEFAULTGW"); + break; + case DNS: + snprintf(str, sizeof(str), "%s", "DNS"); + break; + } + + if (type == DNS) { + snprintf(sub_str, sizeof(sub_str), "%d", ++i); + } else if (j == 0) { + ++j; + } else { + snprintf(sub_str, sizeof(sub_str), "_%d", j++); + } + } else { + return HV_INVALIDARG; + } + + error = kvp_write_file(f, str, sub_str, addr); + if (error) + return error; + memset(addr, 0, sizeof(addr)); + } + + return 0; +} + +static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val) +{ + int error = 0; + char if_file[128]; + FILE *file; + char cmd[512]; + char *mac_addr; + + /* + * Set the configuration for the specified interface with + * the information provided. Since there is no standard + * way to configure an interface, we will have an external + * script that does the job of configuring the interface and + * flushing the configuration. + * + * The parameters passed to this external script are: + * 1. A configuration file that has the specified configuration. + * + * We will embed the name of the interface in the configuration + * file: ifcfg-ethx (where ethx is the interface name). + * + * The information provided here may be more than what is needed + * in a given distro to configure the interface and so are free + * ignore information that may not be relevant. + * + * Here is the format of the ip configuration file: + * + * HWADDR=macaddr + * DEVICE=interface name + * BOOTPROTO= (where is "dhcp" if DHCP is configured + * or "none" if no boot-time protocol should be used) + * + * IPADDR0=ipaddr1 + * IPADDR1=ipaddr2 + * IPADDRx=ipaddry (where y = x + 1) + * + * NETMASK0=netmask1 + * NETMASKx=netmasky (where y = x + 1) + * + * GATEWAY=ipaddr1 + * GATEWAYx=ipaddry (where y = x + 1) + * + * DNSx=ipaddrx (where first DNS address is tagged as DNS1 etc) + * + * IPV6 addresses will be tagged as IPV6ADDR, IPV6 gateway will be + * tagged as IPV6_DEFAULTGW and IPV6 NETMASK will be tagged as + * IPV6NETMASK. + * + * The host can specify multiple ipv4 and ipv6 addresses to be + * configured for the interface. Furthermore, the configuration + * needs to be persistent. A subsequent GET call on the interface + * is expected to return the configuration that is set via the SET + * call. + */ + + snprintf(if_file, sizeof(if_file), "%s%s%s", KVP_CONFIG_LOC, + "/ifcfg-", if_name); + + file = fopen(if_file, "w"); + + if (file == NULL) { + syslog(LOG_ERR, "Failed to open config file"); + return HV_E_FAIL; + } + + /* + * First write out the MAC address. + */ + + mac_addr = kvp_if_name_to_mac(if_name); + if (mac_addr == NULL) { + error = HV_E_FAIL; + goto setval_error; + } + + error = kvp_write_file(file, "HWADDR", "", mac_addr); + if (error) + goto setval_error; + + error = kvp_write_file(file, "DEVICE", "", if_name); + if (error) + goto setval_error; + + if (new_val->dhcp_enabled) { + error = kvp_write_file(file, "BOOTPROTO", "", "dhcp"); + if (error) + goto setval_error; + + /* + * We are done!. + */ + goto setval_done; + + } else { + error = kvp_write_file(file, "BOOTPROTO", "", "none"); + if (error) + goto setval_error; + } + + /* + * Write the configuration for ipaddress, netmask, gateway and + * name servers. + */ + + error = process_ip_string(file, (char *)new_val->ip_addr, IPADDR); + if (error) + goto setval_error; + + error = process_ip_string(file, (char *)new_val->sub_net, NETMASK); + if (error) + goto setval_error; + + error = process_ip_string(file, (char *)new_val->gate_way, GATEWAY); + if (error) + goto setval_error; + + error = process_ip_string(file, (char *)new_val->dns_addr, DNS); + if (error) + goto setval_error; + +setval_done: + free(mac_addr); + fclose(file); + + /* + * Now that we have populated the configuration file, + * invoke the external script to do its magic. + */ + + snprintf(cmd, sizeof(cmd), "%s %s", "hv_set_ifconfig", if_file); + system(cmd); + return 0; + +setval_error: + syslog(LOG_ERR, "Failed to write config file"); + free(mac_addr); + fclose(file); + return error; +} + + +static int +kvp_get_domain_name(char *buffer, int length) +{ + struct addrinfo hints, *info ; + int error = 0; + + gethostname(buffer, length); + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; /*Get only ipv4 addrinfo. */ + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_CANONNAME; + + error = getaddrinfo(buffer, NULL, &hints, &info); + if (error != 0) { + strcpy(buffer, "getaddrinfo failed\n"); + return error; + } + strcpy(buffer, info->ai_canonname); + freeaddrinfo(info); + return error; +} + +static int +netlink_send(int fd, struct cn_msg *msg) +{ + struct nlmsghdr *nlh; + unsigned int size; + struct msghdr message; + char buffer[64]; + struct iovec iov[2]; + + size = NLMSG_SPACE(sizeof(struct cn_msg) + msg->len); + + nlh = (struct nlmsghdr *)buffer; + nlh->nlmsg_seq = 0; + nlh->nlmsg_pid = getpid(); + nlh->nlmsg_type = NLMSG_DONE; + nlh->nlmsg_len = NLMSG_LENGTH(size - sizeof(*nlh)); + nlh->nlmsg_flags = 0; + + iov[0].iov_base = nlh; + iov[0].iov_len = sizeof(*nlh); + + iov[1].iov_base = msg; + iov[1].iov_len = size; + + memset(&message, 0, sizeof(message)); + message.msg_name = &addr; + message.msg_namelen = sizeof(addr); + message.msg_iov = iov; + message.msg_iovlen = 2; + + return sendmsg(fd, &message, 0); +} + +int main(void) +{ + int fd, len, nl_group; + int error; + struct cn_msg *message; + struct pollfd pfd; + struct nlmsghdr *incoming_msg; + struct cn_msg *incoming_cn_msg; + struct hv_kvp_msg *hv_msg; + char *p; + char *key_value; + char *key_name; + int op; + int pool; + char *if_name; + struct hv_kvp_ipaddr_value *kvp_ip_val; + + daemon(1, 0); + openlog("KVP", 0, LOG_USER); + syslog(LOG_INFO, "KVP starting; pid is:%d", getpid()); + /* + * Retrieve OS release information. + */ + kvp_get_os_info(); + + if (kvp_file_init()) { + syslog(LOG_ERR, "Failed to initialize the pools"); + exit(EXIT_FAILURE); + } + + fd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR); + if (fd < 0) { + syslog(LOG_ERR, "netlink socket creation failed; error:%d", fd); + exit(EXIT_FAILURE); + } + addr.nl_family = AF_NETLINK; + addr.nl_pad = 0; + addr.nl_pid = 0; + addr.nl_groups = 0; + + + error = bind(fd, (struct sockaddr *)&addr, sizeof(addr)); + if (error < 0) { + syslog(LOG_ERR, "bind failed; error:%d", error); + close(fd); + exit(EXIT_FAILURE); + } + nl_group = CN_KVP_IDX; + setsockopt(fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, &nl_group, sizeof(nl_group)); + /* + * Register ourselves with the kernel. + */ + message = (struct cn_msg *)kvp_send_buffer; + message->id.idx = CN_KVP_IDX; + message->id.val = CN_KVP_VAL; + + hv_msg = (struct hv_kvp_msg *)message->data; + hv_msg->kvp_hdr.operation = KVP_OP_REGISTER1; + message->ack = 0; + message->len = sizeof(struct hv_kvp_msg); + + len = netlink_send(fd, message); + if (len < 0) { + syslog(LOG_ERR, "netlink_send failed; error:%d", len); + close(fd); + exit(EXIT_FAILURE); + } + + pfd.fd = fd; + + while (1) { + struct sockaddr *addr_p = (struct sockaddr *) &addr; + socklen_t addr_l = sizeof(addr); + pfd.events = POLLIN; + pfd.revents = 0; + poll(&pfd, 1, -1); + + len = recvfrom(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0, + addr_p, &addr_l); + + if (len < 0) { + syslog(LOG_ERR, "recvfrom failed; pid:%u error:%d %s", + addr.nl_pid, errno, strerror(errno)); + close(fd); + return -1; + } + + if (addr.nl_pid) { + syslog(LOG_WARNING, "Received packet from untrusted pid:%u", + addr.nl_pid); + continue; + } + + incoming_msg = (struct nlmsghdr *)kvp_recv_buffer; + + if (incoming_msg->nlmsg_type != NLMSG_DONE) + continue; + + incoming_cn_msg = (struct cn_msg *)NLMSG_DATA(incoming_msg); + hv_msg = (struct hv_kvp_msg *)incoming_cn_msg->data; + + /* + * We will use the KVP header information to pass back + * the error from this daemon. So, first copy the state + * and set the error code to success. + */ + op = hv_msg->kvp_hdr.operation; + pool = hv_msg->kvp_hdr.pool; + hv_msg->error = HV_S_OK; + + if ((in_hand_shake) && (op == KVP_OP_REGISTER1)) { + /* + * Driver is registering with us; stash away the version + * information. + */ + in_hand_shake = 0; + p = (char *)hv_msg->body.kvp_register.version; + lic_version = malloc(strlen(p) + 1); + if (lic_version) { + strcpy(lic_version, p); + syslog(LOG_INFO, "KVP LIC Version: %s", + lic_version); + } else { + syslog(LOG_ERR, "malloc failed"); + } + continue; + } + + switch (op) { + case KVP_OP_GET_IP_INFO: + kvp_ip_val = &hv_msg->body.kvp_ip_val; + if_name = + kvp_mac_to_if_name((char *)kvp_ip_val->adapter_id); + + if (if_name == NULL) { + /* + * We could not map the mac address to an + * interface name; return error. + */ + hv_msg->error = HV_E_FAIL; + break; + } + error = kvp_get_ip_info( + 0, if_name, KVP_OP_GET_IP_INFO, + kvp_ip_val, + (MAX_IP_ADDR_SIZE * 2)); + + if (error) + hv_msg->error = error; + + free(if_name); + break; + + case KVP_OP_SET_IP_INFO: + kvp_ip_val = &hv_msg->body.kvp_ip_val; + if_name = kvp_get_if_name( + (char *)kvp_ip_val->adapter_id); + if (if_name == NULL) { + /* + * We could not map the guid to an + * interface name; return error. + */ + hv_msg->error = HV_GUID_NOTFOUND; + break; + } + error = kvp_set_ip_info(if_name, kvp_ip_val); + if (error) + hv_msg->error = error; + + free(if_name); + break; + + case KVP_OP_SET: + if (kvp_key_add_or_modify(pool, + hv_msg->body.kvp_set.data.key, + hv_msg->body.kvp_set.data.key_size, + hv_msg->body.kvp_set.data.value, + hv_msg->body.kvp_set.data.value_size)) + hv_msg->error = HV_S_CONT; + break; + + case KVP_OP_GET: + if (kvp_get_value(pool, + hv_msg->body.kvp_set.data.key, + hv_msg->body.kvp_set.data.key_size, + hv_msg->body.kvp_set.data.value, + hv_msg->body.kvp_set.data.value_size)) + hv_msg->error = HV_S_CONT; + break; + + case KVP_OP_DELETE: + if (kvp_key_delete(pool, + hv_msg->body.kvp_delete.key, + hv_msg->body.kvp_delete.key_size)) + hv_msg->error = HV_S_CONT; + break; + + default: + break; + } + + if (op != KVP_OP_ENUMERATE) + goto kvp_done; + + /* + * If the pool is KVP_POOL_AUTO, dynamically generate + * both the key and the value; if not read from the + * appropriate pool. + */ + if (pool != KVP_POOL_AUTO) { + if (kvp_pool_enumerate(pool, + hv_msg->body.kvp_enum_data.index, + hv_msg->body.kvp_enum_data.data.key, + HV_KVP_EXCHANGE_MAX_KEY_SIZE, + hv_msg->body.kvp_enum_data.data.value, + HV_KVP_EXCHANGE_MAX_VALUE_SIZE)) + hv_msg->error = HV_S_CONT; + goto kvp_done; + } + + hv_msg = (struct hv_kvp_msg *)incoming_cn_msg->data; + key_name = (char *)hv_msg->body.kvp_enum_data.data.key; + key_value = (char *)hv_msg->body.kvp_enum_data.data.value; + + switch (hv_msg->body.kvp_enum_data.index) { + case FullyQualifiedDomainName: + kvp_get_domain_name(key_value, + HV_KVP_EXCHANGE_MAX_VALUE_SIZE); + strcpy(key_name, "FullyQualifiedDomainName"); + break; + case IntegrationServicesVersion: + strcpy(key_name, "IntegrationServicesVersion"); + strcpy(key_value, lic_version); + break; + case NetworkAddressIPv4: + kvp_get_ip_info(AF_INET, NULL, KVP_OP_ENUMERATE, + key_value, HV_KVP_EXCHANGE_MAX_VALUE_SIZE); + strcpy(key_name, "NetworkAddressIPv4"); + break; + case NetworkAddressIPv6: + kvp_get_ip_info(AF_INET6, NULL, KVP_OP_ENUMERATE, + key_value, HV_KVP_EXCHANGE_MAX_VALUE_SIZE); + strcpy(key_name, "NetworkAddressIPv6"); + break; + case OSBuildNumber: + strcpy(key_value, os_build); + strcpy(key_name, "OSBuildNumber"); + break; + case OSName: + strcpy(key_value, os_name); + strcpy(key_name, "OSName"); + break; + case OSMajorVersion: + strcpy(key_value, os_major); + strcpy(key_name, "OSMajorVersion"); + break; + case OSMinorVersion: + strcpy(key_value, os_minor); + strcpy(key_name, "OSMinorVersion"); + break; + case OSVersion: + strcpy(key_value, os_version); + strcpy(key_name, "OSVersion"); + break; + case ProcessorArchitecture: + strcpy(key_value, processor_arch); + strcpy(key_name, "ProcessorArchitecture"); + break; + default: + hv_msg->error = HV_S_CONT; + break; + } + /* + * Send the value back to the kernel. The response is + * already in the receive buffer. Update the cn_msg header to + * reflect the key value that has been added to the message + */ +kvp_done: + + incoming_cn_msg->id.idx = CN_KVP_IDX; + incoming_cn_msg->id.val = CN_KVP_VAL; + incoming_cn_msg->ack = 0; + incoming_cn_msg->len = sizeof(struct hv_kvp_msg); + + len = netlink_send(fd, incoming_cn_msg); + if (len < 0) { + syslog(LOG_ERR, "net_link send failed; error:%d", len); + exit(EXIT_FAILURE); + } + } + +} diff --git a/tools/hv/hv_set_ifconfig.sh b/tools/hv/hv_set_ifconfig.sh new file mode 100755 index 00000000..735aafd6 --- /dev/null +++ b/tools/hv/hv_set_ifconfig.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# This example script activates an interface based on the specified +# configuration. +# +# In the interest of keeping the KVP daemon code free of distro specific +# information; the kvp daemon code invokes this external script to configure +# the interface. +# +# The only argument to this script is the configuration file that is to +# be used to configure the interface. +# +# Each Distro is expected to implement this script in a distro specific +# fashion. For instance on Distros that ship with Network Manager enabled, +# this script can be based on the Network Manager APIs for configuring the +# interface. +# +# This example script is based on a RHEL environment. +# +# Here is the format of the ip configuration file: +# +# HWADDR=macaddr +# DEVICE=interface name +# BOOTPROTO= (where is "dhcp" if DHCP is configured +# or "none" if no boot-time protocol should be used) +# +# IPADDR0=ipaddr1 +# IPADDR1=ipaddr2 +# IPADDRx=ipaddry (where y = x + 1) +# +# NETMASK0=netmask1 +# NETMASKx=netmasky (where y = x + 1) +# +# GATEWAY=ipaddr1 +# GATEWAYx=ipaddry (where y = x + 1) +# +# DNSx=ipaddrx (where first DNS address is tagged as DNS1 etc) +# +# IPV6 addresses will be tagged as IPV6ADDR, IPV6 gateway will be +# tagged as IPV6_DEFAULTGW and IPV6 NETMASK will be tagged as +# IPV6NETMASK. +# +# The host can specify multiple ipv4 and ipv6 addresses to be +# configured for the interface. Furthermore, the configuration +# needs to be persistent. A subsequent GET call on the interface +# is expected to return the configuration that is set via the SET +# call. +# + + + +echo "IPV6INIT=yes" >> $1 +echo "NM_CONTROLLED=no" >> $1 +echo "PEERDNS=yes" >> $1 +echo "ONBOOT=yes" >> $1 + + +cp $1 /etc/sysconfig/network-scripts/ + + +interface=$(echo $1 | awk -F - '{ print $2 }') + +/sbin/ifdown $interface 2>/dev/null +/sbin/ifup $interface 2>/dev/null diff --git a/tools/hv/hv_vss_daemon.c b/tools/hv/hv_vss_daemon.c new file mode 100644 index 00000000..fea03a3e --- /dev/null +++ b/tools/hv/hv_vss_daemon.c @@ -0,0 +1,249 @@ +/* + * An implementation of the host initiated guest snapshot for Hyper-V. + * + * + * Copyright (C) 2013, Microsoft, Inc. + * Author : K. Y. Srinivasan + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + * 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, GOOD TITLE or + * NON INFRINGEMENT. See the GNU General Public License for more + * details. + * + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static char vss_recv_buffer[4096]; +static char vss_send_buffer[4096]; +static struct sockaddr_nl addr; + +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + + +static int vss_do_freeze(char *dir, unsigned int cmd, char *fs_op) +{ + int ret, fd = open(dir, O_RDONLY); + + if (fd < 0) + return 1; + ret = ioctl(fd, cmd, 0); + syslog(LOG_INFO, "VSS: %s of %s: %s\n", fs_op, dir, strerror(errno)); + close(fd); + return !!ret; +} + +static int vss_operate(int operation) +{ + char *fs_op; + char match[] = "/dev/"; + FILE *mounts; + struct mntent *ent; + unsigned int cmd; + int error = 0, root_seen = 0; + + switch (operation) { + case VSS_OP_FREEZE: + cmd = FIFREEZE; + fs_op = "freeze"; + break; + case VSS_OP_THAW: + cmd = FITHAW; + fs_op = "thaw"; + break; + default: + return -1; + } + + mounts = setmntent("/proc/mounts", "r"); + if (mounts == NULL) + return -1; + + while ((ent = getmntent(mounts))) { + if (strncmp(ent->mnt_fsname, match, strlen(match))) + continue; + if (strcmp(ent->mnt_type, "iso9660") == 0) + continue; + if (strcmp(ent->mnt_dir, "/") == 0) { + root_seen = 1; + continue; + } + error |= vss_do_freeze(ent->mnt_dir, cmd, fs_op); + } + endmntent(mounts); + + if (root_seen) { + error |= vss_do_freeze("/", cmd, fs_op); + } + + return error; +} + +static int netlink_send(int fd, struct cn_msg *msg) +{ + struct nlmsghdr *nlh; + unsigned int size; + struct msghdr message; + char buffer[64]; + struct iovec iov[2]; + + size = NLMSG_SPACE(sizeof(struct cn_msg) + msg->len); + + nlh = (struct nlmsghdr *)buffer; + nlh->nlmsg_seq = 0; + nlh->nlmsg_pid = getpid(); + nlh->nlmsg_type = NLMSG_DONE; + nlh->nlmsg_len = NLMSG_LENGTH(size - sizeof(*nlh)); + nlh->nlmsg_flags = 0; + + iov[0].iov_base = nlh; + iov[0].iov_len = sizeof(*nlh); + + iov[1].iov_base = msg; + iov[1].iov_len = size; + + memset(&message, 0, sizeof(message)); + message.msg_name = &addr; + message.msg_namelen = sizeof(addr); + message.msg_iov = iov; + message.msg_iovlen = 2; + + return sendmsg(fd, &message, 0); +} + +int main(void) +{ + int fd, len, nl_group; + int error; + struct cn_msg *message; + struct pollfd pfd; + struct nlmsghdr *incoming_msg; + struct cn_msg *incoming_cn_msg; + int op; + struct hv_vss_msg *vss_msg; + + if (daemon(1, 0)) + return 1; + + openlog("Hyper-V VSS", 0, LOG_USER); + syslog(LOG_INFO, "VSS starting; pid is:%d", getpid()); + + fd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR); + if (fd < 0) { + syslog(LOG_ERR, "netlink socket creation failed; error:%d", fd); + exit(EXIT_FAILURE); + } + addr.nl_family = AF_NETLINK; + addr.nl_pad = 0; + addr.nl_pid = 0; + addr.nl_groups = 0; + + + error = bind(fd, (struct sockaddr *)&addr, sizeof(addr)); + if (error < 0) { + syslog(LOG_ERR, "bind failed; error:%d", error); + close(fd); + exit(EXIT_FAILURE); + } + nl_group = CN_VSS_IDX; + setsockopt(fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, &nl_group, sizeof(nl_group)); + /* + * Register ourselves with the kernel. + */ + message = (struct cn_msg *)vss_send_buffer; + message->id.idx = CN_VSS_IDX; + message->id.val = CN_VSS_VAL; + message->ack = 0; + vss_msg = (struct hv_vss_msg *)message->data; + vss_msg->vss_hdr.operation = VSS_OP_REGISTER; + + message->len = sizeof(struct hv_vss_msg); + + len = netlink_send(fd, message); + if (len < 0) { + syslog(LOG_ERR, "netlink_send failed; error:%d", len); + close(fd); + exit(EXIT_FAILURE); + } + + pfd.fd = fd; + + while (1) { + struct sockaddr *addr_p = (struct sockaddr *) &addr; + socklen_t addr_l = sizeof(addr); + pfd.events = POLLIN; + pfd.revents = 0; + poll(&pfd, 1, -1); + + len = recvfrom(fd, vss_recv_buffer, sizeof(vss_recv_buffer), 0, + addr_p, &addr_l); + + if (len < 0) { + syslog(LOG_ERR, "recvfrom failed; pid:%u error:%d %s", + addr.nl_pid, errno, strerror(errno)); + close(fd); + return -1; + } + + if (addr.nl_pid) { + syslog(LOG_WARNING, + "Received packet from untrusted pid:%u", + addr.nl_pid); + continue; + } + + incoming_msg = (struct nlmsghdr *)vss_recv_buffer; + + if (incoming_msg->nlmsg_type != NLMSG_DONE) + continue; + + incoming_cn_msg = (struct cn_msg *)NLMSG_DATA(incoming_msg); + vss_msg = (struct hv_vss_msg *)incoming_cn_msg->data; + op = vss_msg->vss_hdr.operation; + error = HV_S_OK; + + switch (op) { + case VSS_OP_FREEZE: + case VSS_OP_THAW: + error = vss_operate(op); + if (error) + error = HV_E_FAIL; + break; + default: + syslog(LOG_ERR, "Illegal op:%d\n", op); + } + vss_msg->error = error; + len = netlink_send(fd, incoming_cn_msg); + if (len < 0) { + syslog(LOG_ERR, "net_link send failed; error:%d", len); + exit(EXIT_FAILURE); + } + } + +} diff --git a/tools/include/tools/be_byteshift.h b/tools/include/tools/be_byteshift.h new file mode 100644 index 00000000..f4912e26 --- /dev/null +++ b/tools/include/tools/be_byteshift.h @@ -0,0 +1,70 @@ +#ifndef _TOOLS_BE_BYTESHIFT_H +#define _TOOLS_BE_BYTESHIFT_H + +#include + +static inline __u16 __get_unaligned_be16(const __u8 *p) +{ + return p[0] << 8 | p[1]; +} + +static inline __u32 __get_unaligned_be32(const __u8 *p) +{ + return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; +} + +static inline __u64 __get_unaligned_be64(const __u8 *p) +{ + return (__u64)__get_unaligned_be32(p) << 32 | + __get_unaligned_be32(p + 4); +} + +static inline void __put_unaligned_be16(__u16 val, __u8 *p) +{ + *p++ = val >> 8; + *p++ = val; +} + +static inline void __put_unaligned_be32(__u32 val, __u8 *p) +{ + __put_unaligned_be16(val >> 16, p); + __put_unaligned_be16(val, p + 2); +} + +static inline void __put_unaligned_be64(__u64 val, __u8 *p) +{ + __put_unaligned_be32(val >> 32, p); + __put_unaligned_be32(val, p + 4); +} + +static inline __u16 get_unaligned_be16(const void *p) +{ + return __get_unaligned_be16((const __u8 *)p); +} + +static inline __u32 get_unaligned_be32(const void *p) +{ + return __get_unaligned_be32((const __u8 *)p); +} + +static inline __u64 get_unaligned_be64(const void *p) +{ + return __get_unaligned_be64((const __u8 *)p); +} + +static inline void put_unaligned_be16(__u16 val, void *p) +{ + __put_unaligned_be16(val, p); +} + +static inline void put_unaligned_be32(__u32 val, void *p) +{ + __put_unaligned_be32(val, p); +} + +static inline void put_unaligned_be64(__u64 val, void *p) +{ + __put_unaligned_be64(val, p); +} + +#endif /* _TOOLS_BE_BYTESHIFT_H */ diff --git a/tools/include/tools/le_byteshift.h b/tools/include/tools/le_byteshift.h new file mode 100644 index 00000000..c99d45a6 --- /dev/null +++ b/tools/include/tools/le_byteshift.h @@ -0,0 +1,70 @@ +#ifndef _TOOLS_LE_BYTESHIFT_H +#define _TOOLS_LE_BYTESHIFT_H + +#include + +static inline __u16 __get_unaligned_le16(const __u8 *p) +{ + return p[0] | p[1] << 8; +} + +static inline __u32 __get_unaligned_le32(const __u8 *p) +{ + return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24; +} + +static inline __u64 __get_unaligned_le64(const __u8 *p) +{ + return (__u64)__get_unaligned_le32(p + 4) << 32 | + __get_unaligned_le32(p); +} + +static inline void __put_unaligned_le16(__u16 val, __u8 *p) +{ + *p++ = val; + *p++ = val >> 8; +} + +static inline void __put_unaligned_le32(__u32 val, __u8 *p) +{ + __put_unaligned_le16(val >> 16, p + 2); + __put_unaligned_le16(val, p); +} + +static inline void __put_unaligned_le64(__u64 val, __u8 *p) +{ + __put_unaligned_le32(val >> 32, p + 4); + __put_unaligned_le32(val, p); +} + +static inline __u16 get_unaligned_le16(const void *p) +{ + return __get_unaligned_le16((const __u8 *)p); +} + +static inline __u32 get_unaligned_le32(const void *p) +{ + return __get_unaligned_le32((const __u8 *)p); +} + +static inline __u64 get_unaligned_le64(const void *p) +{ + return __get_unaligned_le64((const __u8 *)p); +} + +static inline void put_unaligned_le16(__u16 val, void *p) +{ + __put_unaligned_le16(val, p); +} + +static inline void put_unaligned_le32(__u32 val, void *p) +{ + __put_unaligned_le32(val, p); +} + +static inline void put_unaligned_le64(__u64 val, void *p) +{ + __put_unaligned_le64(val, p); +} + +#endif /* _TOOLS_LE_BYTESHIFT_H */ diff --git a/tools/lguest/.gitignore b/tools/lguest/.gitignore new file mode 100644 index 00000000..115587fd --- /dev/null +++ b/tools/lguest/.gitignore @@ -0,0 +1 @@ +lguest diff --git a/tools/lguest/Makefile b/tools/lguest/Makefile new file mode 100644 index 00000000..0ac34206 --- /dev/null +++ b/tools/lguest/Makefile @@ -0,0 +1,8 @@ +# This creates the demonstration utility "lguest" which runs a Linux guest. +# Missing headers? Add "-I../../../include -I../../../arch/x86/include" +CFLAGS:=-m32 -Wall -Wmissing-declarations -Wmissing-prototypes -O3 -U_FORTIFY_SOURCE + +all: lguest + +clean: + rm -f lguest diff --git a/tools/lguest/extract b/tools/lguest/extract new file mode 100644 index 00000000..7730bb6e --- /dev/null +++ b/tools/lguest/extract @@ -0,0 +1,58 @@ +#! /bin/sh + +set -e + +PREFIX=$1 +shift + +trap 'rm -r $TMPDIR' 0 +TMPDIR=`mktemp -d` + +exec 3>/dev/null +for f; do + while IFS=" +" read -r LINE; do + case "$LINE" in + *$PREFIX:[0-9]*:\**) + NUM=`echo "$LINE" | sed "s/.*$PREFIX:\([0-9]*\).*/\1/"` + if [ -f $TMPDIR/$NUM ]; then + echo "$TMPDIR/$NUM already exits prior to $f" + exit 1 + fi + exec 3>>$TMPDIR/$NUM + echo $f | sed 's,\.\./,,g' > $TMPDIR/.$NUM + /bin/echo "$LINE" | sed -e "s/$PREFIX:[0-9]*//" -e "s/:\*/*/" >&3 + ;; + *$PREFIX:[0-9]*) + NUM=`echo "$LINE" | sed "s/.*$PREFIX:\([0-9]*\).*/\1/"` + if [ -f $TMPDIR/$NUM ]; then + echo "$TMPDIR/$NUM already exits prior to $f" + exit 1 + fi + exec 3>>$TMPDIR/$NUM + echo $f | sed 's,\.\./,,g' > $TMPDIR/.$NUM + /bin/echo "$LINE" | sed "s/$PREFIX:[0-9]*//" >&3 + ;; + *:\**) + /bin/echo "$LINE" | sed -e "s/:\*/*/" -e "s,/\*\*/,," >&3 + echo >&3 + exec 3>/dev/null + ;; + *) + /bin/echo "$LINE" >&3 + ;; + esac + done < $f + echo >&3 + exec 3>/dev/null +done + +LASTFILE="" +for f in $TMPDIR/*; do + if [ "$LASTFILE" != $(cat $TMPDIR/.$(basename $f) ) ]; then + LASTFILE=$(cat $TMPDIR/.$(basename $f) ) + echo "[ $LASTFILE ]" + fi + cat $f +done + diff --git a/tools/lguest/lguest.c b/tools/lguest/lguest.c new file mode 100644 index 00000000..07a03452 --- /dev/null +++ b/tools/lguest/lguest.c @@ -0,0 +1,2052 @@ +/*P:100 + * This is the Launcher code, a simple program which lays out the "physical" + * memory for the new Guest by mapping the kernel image and the virtual + * devices, then opens /dev/lguest to tell the kernel about the Guest and + * control it. +:*/ +#define _LARGEFILE64_SOURCE +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "../../include/linux/lguest_launcher.h" +/*L:110 + * We can ignore the 43 include files we need for this program, but I do want + * to draw attention to the use of kernel-style types. + * + * As Linus said, "C is a Spartan language, and so should your naming be." I + * like these abbreviations, so we define them here. Note that u64 is always + * unsigned long long, which works on all Linux systems: this means that we can + * use %llu in printf for any u64. + */ +typedef unsigned long long u64; +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; +/*:*/ + +#define BRIDGE_PFX "bridge:" +#ifndef SIOCBRADDIF +#define SIOCBRADDIF 0x89a2 /* add interface to bridge */ +#endif +/* We can have up to 256 pages for devices. */ +#define DEVICE_PAGES 256 +/* This will occupy 3 pages: it must be a power of 2. */ +#define VIRTQUEUE_NUM 256 + +/*L:120 + * verbose is both a global flag and a macro. The C preprocessor allows + * this, and although I wouldn't recommend it, it works quite nicely here. + */ +static bool verbose; +#define verbose(args...) \ + do { if (verbose) printf(args); } while(0) +/*:*/ + +/* The pointer to the start of guest memory. */ +static void *guest_base; +/* The maximum guest physical address allowed, and maximum possible. */ +static unsigned long guest_limit, guest_max; +/* The /dev/lguest file descriptor. */ +static int lguest_fd; + +/* a per-cpu variable indicating whose vcpu is currently running */ +static unsigned int __thread cpu_id; + +/* This is our list of devices. */ +struct device_list { + /* Counter to assign interrupt numbers. */ + unsigned int next_irq; + + /* Counter to print out convenient device numbers. */ + unsigned int device_num; + + /* The descriptor page for the devices. */ + u8 *descpage; + + /* A single linked list of devices. */ + struct device *dev; + /* And a pointer to the last device for easy append. */ + struct device *lastdev; +}; + +/* The list of Guest devices, based on command line arguments. */ +static struct device_list devices; + +/* The device structure describes a single device. */ +struct device { + /* The linked-list pointer. */ + struct device *next; + + /* The device's descriptor, as mapped into the Guest. */ + struct lguest_device_desc *desc; + + /* We can't trust desc values once Guest has booted: we use these. */ + unsigned int feature_len; + unsigned int num_vq; + + /* The name of this device, for --verbose. */ + const char *name; + + /* Any queues attached to this device */ + struct virtqueue *vq; + + /* Is it operational */ + bool running; + + /* Device-specific data. */ + void *priv; +}; + +/* The virtqueue structure describes a queue attached to a device. */ +struct virtqueue { + struct virtqueue *next; + + /* Which device owns me. */ + struct device *dev; + + /* The configuration for this queue. */ + struct lguest_vqconfig config; + + /* The actual ring of buffers. */ + struct vring vring; + + /* Last available index we saw. */ + u16 last_avail_idx; + + /* How many are used since we sent last irq? */ + unsigned int pending_used; + + /* Eventfd where Guest notifications arrive. */ + int eventfd; + + /* Function for the thread which is servicing this virtqueue. */ + void (*service)(struct virtqueue *vq); + pid_t thread; +}; + +/* Remember the arguments to the program so we can "reboot" */ +static char **main_args; + +/* The original tty settings to restore on exit. */ +static struct termios orig_term; + +/* + * We have to be careful with barriers: our devices are all run in separate + * threads and so we need to make sure that changes visible to the Guest happen + * in precise order. + */ +#define wmb() __asm__ __volatile__("" : : : "memory") +#define mb() __asm__ __volatile__("" : : : "memory") + +/* Wrapper for the last available index. Makes it easier to change. */ +#define lg_last_avail(vq) ((vq)->last_avail_idx) + +/* + * The virtio configuration space is defined to be little-endian. x86 is + * little-endian too, but it's nice to be explicit so we have these helpers. + */ +#define cpu_to_le16(v16) (v16) +#define cpu_to_le32(v32) (v32) +#define cpu_to_le64(v64) (v64) +#define le16_to_cpu(v16) (v16) +#define le32_to_cpu(v32) (v32) +#define le64_to_cpu(v64) (v64) + +/* Is this iovec empty? */ +static bool iov_empty(const struct iovec iov[], unsigned int num_iov) +{ + unsigned int i; + + for (i = 0; i < num_iov; i++) + if (iov[i].iov_len) + return false; + return true; +} + +/* Take len bytes from the front of this iovec. */ +static void iov_consume(struct iovec iov[], unsigned num_iov, + void *dest, unsigned len) +{ + unsigned int i; + + for (i = 0; i < num_iov; i++) { + unsigned int used; + + used = iov[i].iov_len < len ? iov[i].iov_len : len; + if (dest) { + memcpy(dest, iov[i].iov_base, used); + dest += used; + } + iov[i].iov_base += used; + iov[i].iov_len -= used; + len -= used; + } + if (len != 0) + errx(1, "iovec too short!"); +} + +/* The device virtqueue descriptors are followed by feature bitmasks. */ +static u8 *get_feature_bits(struct device *dev) +{ + return (u8 *)(dev->desc + 1) + + dev->num_vq * sizeof(struct lguest_vqconfig); +} + +/*L:100 + * The Launcher code itself takes us out into userspace, that scary place where + * pointers run wild and free! Unfortunately, like most userspace programs, + * it's quite boring (which is why everyone likes to hack on the kernel!). + * Perhaps if you make up an Lguest Drinking Game at this point, it will get + * you through this section. Or, maybe not. + * + * The Launcher sets up a big chunk of memory to be the Guest's "physical" + * memory and stores it in "guest_base". In other words, Guest physical == + * Launcher virtual with an offset. + * + * This can be tough to get your head around, but usually it just means that we + * use these trivial conversion functions when the Guest gives us its + * "physical" addresses: + */ +static void *from_guest_phys(unsigned long addr) +{ + return guest_base + addr; +} + +static unsigned long to_guest_phys(const void *addr) +{ + return (addr - guest_base); +} + +/*L:130 + * Loading the Kernel. + * + * We start with couple of simple helper routines. open_or_die() avoids + * error-checking code cluttering the callers: + */ +static int open_or_die(const char *name, int flags) +{ + int fd = open(name, flags); + if (fd < 0) + err(1, "Failed to open %s", name); + return fd; +} + +/* map_zeroed_pages() takes a number of pages. */ +static void *map_zeroed_pages(unsigned int num) +{ + int fd = open_or_die("/dev/zero", O_RDONLY); + void *addr; + + /* + * We use a private mapping (ie. if we write to the page, it will be + * copied). We allocate an extra two pages PROT_NONE to act as guard + * pages against read/write attempts that exceed allocated space. + */ + addr = mmap(NULL, getpagesize() * (num+2), + PROT_NONE, MAP_PRIVATE, fd, 0); + + if (addr == MAP_FAILED) + err(1, "Mmapping %u pages of /dev/zero", num); + + if (mprotect(addr + getpagesize(), getpagesize() * num, + PROT_READ|PROT_WRITE) == -1) + err(1, "mprotect rw %u pages failed", num); + + /* + * One neat mmap feature is that you can close the fd, and it + * stays mapped. + */ + close(fd); + + /* Return address after PROT_NONE page */ + return addr + getpagesize(); +} + +/* Get some more pages for a device. */ +static void *get_pages(unsigned int num) +{ + void *addr = from_guest_phys(guest_limit); + + guest_limit += num * getpagesize(); + if (guest_limit > guest_max) + errx(1, "Not enough memory for devices"); + return addr; +} + +/* + * This routine is used to load the kernel or initrd. It tries mmap, but if + * that fails (Plan 9's kernel file isn't nicely aligned on page boundaries), + * it falls back to reading the memory in. + */ +static void map_at(int fd, void *addr, unsigned long offset, unsigned long len) +{ + ssize_t r; + + /* + * We map writable even though for some segments are marked read-only. + * The kernel really wants to be writable: it patches its own + * instructions. + * + * MAP_PRIVATE means that the page won't be copied until a write is + * done to it. This allows us to share untouched memory between + * Guests. + */ + if (mmap(addr, len, PROT_READ|PROT_WRITE, + MAP_FIXED|MAP_PRIVATE, fd, offset) != MAP_FAILED) + return; + + /* pread does a seek and a read in one shot: saves a few lines. */ + r = pread(fd, addr, len, offset); + if (r != len) + err(1, "Reading offset %lu len %lu gave %zi", offset, len, r); +} + +/* + * This routine takes an open vmlinux image, which is in ELF, and maps it into + * the Guest memory. ELF = Embedded Linking Format, which is the format used + * by all modern binaries on Linux including the kernel. + * + * The ELF headers give *two* addresses: a physical address, and a virtual + * address. We use the physical address; the Guest will map itself to the + * virtual address. + * + * We return the starting address. + */ +static unsigned long map_elf(int elf_fd, const Elf32_Ehdr *ehdr) +{ + Elf32_Phdr phdr[ehdr->e_phnum]; + unsigned int i; + + /* + * Sanity checks on the main ELF header: an x86 executable with a + * reasonable number of correctly-sized program headers. + */ + if (ehdr->e_type != ET_EXEC + || ehdr->e_machine != EM_386 + || ehdr->e_phentsize != sizeof(Elf32_Phdr) + || ehdr->e_phnum < 1 || ehdr->e_phnum > 65536U/sizeof(Elf32_Phdr)) + errx(1, "Malformed elf header"); + + /* + * An ELF executable contains an ELF header and a number of "program" + * headers which indicate which parts ("segments") of the program to + * load where. + */ + + /* We read in all the program headers at once: */ + if (lseek(elf_fd, ehdr->e_phoff, SEEK_SET) < 0) + err(1, "Seeking to program headers"); + if (read(elf_fd, phdr, sizeof(phdr)) != sizeof(phdr)) + err(1, "Reading program headers"); + + /* + * Try all the headers: there are usually only three. A read-only one, + * a read-write one, and a "note" section which we don't load. + */ + for (i = 0; i < ehdr->e_phnum; i++) { + /* If this isn't a loadable segment, we ignore it */ + if (phdr[i].p_type != PT_LOAD) + continue; + + verbose("Section %i: size %i addr %p\n", + i, phdr[i].p_memsz, (void *)phdr[i].p_paddr); + + /* We map this section of the file at its physical address. */ + map_at(elf_fd, from_guest_phys(phdr[i].p_paddr), + phdr[i].p_offset, phdr[i].p_filesz); + } + + /* The entry point is given in the ELF header. */ + return ehdr->e_entry; +} + +/*L:150 + * A bzImage, unlike an ELF file, is not meant to be loaded. You're supposed + * to jump into it and it will unpack itself. We used to have to perform some + * hairy magic because the unpacking code scared me. + * + * Fortunately, Jeremy Fitzhardinge convinced me it wasn't that hard and wrote + * a small patch to jump over the tricky bits in the Guest, so now we just read + * the funky header so we know where in the file to load, and away we go! + */ +static unsigned long load_bzimage(int fd) +{ + struct boot_params boot; + int r; + /* Modern bzImages get loaded at 1M. */ + void *p = from_guest_phys(0x100000); + + /* + * Go back to the start of the file and read the header. It should be + * a Linux boot header (see Documentation/x86/boot.txt) + */ + lseek(fd, 0, SEEK_SET); + read(fd, &boot, sizeof(boot)); + + /* Inside the setup_hdr, we expect the magic "HdrS" */ + if (memcmp(&boot.hdr.header, "HdrS", 4) != 0) + errx(1, "This doesn't look like a bzImage to me"); + + /* Skip over the extra sectors of the header. */ + lseek(fd, (boot.hdr.setup_sects+1) * 512, SEEK_SET); + + /* Now read everything into memory. in nice big chunks. */ + while ((r = read(fd, p, 65536)) > 0) + p += r; + + /* Finally, code32_start tells us where to enter the kernel. */ + return boot.hdr.code32_start; +} + +/*L:140 + * Loading the kernel is easy when it's a "vmlinux", but most kernels + * come wrapped up in the self-decompressing "bzImage" format. With a little + * work, we can load those, too. + */ +static unsigned long load_kernel(int fd) +{ + Elf32_Ehdr hdr; + + /* Read in the first few bytes. */ + if (read(fd, &hdr, sizeof(hdr)) != sizeof(hdr)) + err(1, "Reading kernel"); + + /* If it's an ELF file, it starts with "\177ELF" */ + if (memcmp(hdr.e_ident, ELFMAG, SELFMAG) == 0) + return map_elf(fd, &hdr); + + /* Otherwise we assume it's a bzImage, and try to load it. */ + return load_bzimage(fd); +} + +/* + * This is a trivial little helper to align pages. Andi Kleen hated it because + * it calls getpagesize() twice: "it's dumb code." + * + * Kernel guys get really het up about optimization, even when it's not + * necessary. I leave this code as a reaction against that. + */ +static inline unsigned long page_align(unsigned long addr) +{ + /* Add upwards and truncate downwards. */ + return ((addr + getpagesize()-1) & ~(getpagesize()-1)); +} + +/*L:180 + * An "initial ram disk" is a disk image loaded into memory along with the + * kernel which the kernel can use to boot from without needing any drivers. + * Most distributions now use this as standard: the initrd contains the code to + * load the appropriate driver modules for the current machine. + * + * Importantly, James Morris works for RedHat, and Fedora uses initrds for its + * kernels. He sent me this (and tells me when I break it). + */ +static unsigned long load_initrd(const char *name, unsigned long mem) +{ + int ifd; + struct stat st; + unsigned long len; + + ifd = open_or_die(name, O_RDONLY); + /* fstat() is needed to get the file size. */ + if (fstat(ifd, &st) < 0) + err(1, "fstat() on initrd '%s'", name); + + /* + * We map the initrd at the top of memory, but mmap wants it to be + * page-aligned, so we round the size up for that. + */ + len = page_align(st.st_size); + map_at(ifd, from_guest_phys(mem - len), 0, st.st_size); + /* + * Once a file is mapped, you can close the file descriptor. It's a + * little odd, but quite useful. + */ + close(ifd); + verbose("mapped initrd %s size=%lu @ %p\n", name, len, (void*)mem-len); + + /* We return the initrd size. */ + return len; +} +/*:*/ + +/* + * Simple routine to roll all the commandline arguments together with spaces + * between them. + */ +static void concat(char *dst, char *args[]) +{ + unsigned int i, len = 0; + + for (i = 0; args[i]; i++) { + if (i) { + strcat(dst+len, " "); + len++; + } + strcpy(dst+len, args[i]); + len += strlen(args[i]); + } + /* In case it's empty. */ + dst[len] = '\0'; +} + +/*L:185 + * This is where we actually tell the kernel to initialize the Guest. We + * saw the arguments it expects when we looked at initialize() in lguest_user.c: + * the base of Guest "physical" memory, the top physical page to allow and the + * entry point for the Guest. + */ +static void tell_kernel(unsigned long start) +{ + unsigned long args[] = { LHREQ_INITIALIZE, + (unsigned long)guest_base, + guest_limit / getpagesize(), start }; + verbose("Guest: %p - %p (%#lx)\n", + guest_base, guest_base + guest_limit, guest_limit); + lguest_fd = open_or_die("/dev/lguest", O_RDWR); + if (write(lguest_fd, args, sizeof(args)) < 0) + err(1, "Writing to /dev/lguest"); +} +/*:*/ + +/*L:200 + * Device Handling. + * + * When the Guest gives us a buffer, it sends an array of addresses and sizes. + * We need to make sure it's not trying to reach into the Launcher itself, so + * we have a convenient routine which checks it and exits with an error message + * if something funny is going on: + */ +static void *_check_pointer(unsigned long addr, unsigned int size, + unsigned int line) +{ + /* + * Check if the requested address and size exceeds the allocated memory, + * or addr + size wraps around. + */ + if ((addr + size) > guest_limit || (addr + size) < addr) + errx(1, "%s:%i: Invalid address %#lx", __FILE__, line, addr); + /* + * We return a pointer for the caller's convenience, now we know it's + * safe to use. + */ + return from_guest_phys(addr); +} +/* A macro which transparently hands the line number to the real function. */ +#define check_pointer(addr,size) _check_pointer(addr, size, __LINE__) + +/* + * Each buffer in the virtqueues is actually a chain of descriptors. This + * function returns the next descriptor in the chain, or vq->vring.num if we're + * at the end. + */ +static unsigned next_desc(struct vring_desc *desc, + unsigned int i, unsigned int max) +{ + unsigned int next; + + /* If this descriptor says it doesn't chain, we're done. */ + if (!(desc[i].flags & VRING_DESC_F_NEXT)) + return max; + + /* Check they're not leading us off end of descriptors. */ + next = desc[i].next; + /* Make sure compiler knows to grab that: we don't want it changing! */ + wmb(); + + if (next >= max) + errx(1, "Desc next is %u", next); + + return next; +} + +/* + * This actually sends the interrupt for this virtqueue, if we've used a + * buffer. + */ +static void trigger_irq(struct virtqueue *vq) +{ + unsigned long buf[] = { LHREQ_IRQ, vq->config.irq }; + + /* Don't inform them if nothing used. */ + if (!vq->pending_used) + return; + vq->pending_used = 0; + + /* If they don't want an interrupt, don't send one... */ + if (vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT) { + return; + } + + /* Send the Guest an interrupt tell them we used something up. */ + if (write(lguest_fd, buf, sizeof(buf)) != 0) + err(1, "Triggering irq %i", vq->config.irq); +} + +/* + * This looks in the virtqueue for the first available buffer, and converts + * it to an iovec for convenient access. Since descriptors consist of some + * number of output then some number of input descriptors, it's actually two + * iovecs, but we pack them into one and note how many of each there were. + * + * This function waits if necessary, and returns the descriptor number found. + */ +static unsigned wait_for_vq_desc(struct virtqueue *vq, + struct iovec iov[], + unsigned int *out_num, unsigned int *in_num) +{ + unsigned int i, head, max; + struct vring_desc *desc; + u16 last_avail = lg_last_avail(vq); + + /* There's nothing available? */ + while (last_avail == vq->vring.avail->idx) { + u64 event; + + /* + * Since we're about to sleep, now is a good time to tell the + * Guest about what we've used up to now. + */ + trigger_irq(vq); + + /* OK, now we need to know about added descriptors. */ + vq->vring.used->flags &= ~VRING_USED_F_NO_NOTIFY; + + /* + * They could have slipped one in as we were doing that: make + * sure it's written, then check again. + */ + mb(); + if (last_avail != vq->vring.avail->idx) { + vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY; + break; + } + + /* Nothing new? Wait for eventfd to tell us they refilled. */ + if (read(vq->eventfd, &event, sizeof(event)) != sizeof(event)) + errx(1, "Event read failed?"); + + /* We don't need to be notified again. */ + vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY; + } + + /* Check it isn't doing very strange things with descriptor numbers. */ + if ((u16)(vq->vring.avail->idx - last_avail) > vq->vring.num) + errx(1, "Guest moved used index from %u to %u", + last_avail, vq->vring.avail->idx); + + /* + * Grab the next descriptor number they're advertising, and increment + * the index we've seen. + */ + head = vq->vring.avail->ring[last_avail % vq->vring.num]; + lg_last_avail(vq)++; + + /* If their number is silly, that's a fatal mistake. */ + if (head >= vq->vring.num) + errx(1, "Guest says index %u is available", head); + + /* When we start there are none of either input nor output. */ + *out_num = *in_num = 0; + + max = vq->vring.num; + desc = vq->vring.desc; + i = head; + + /* + * If this is an indirect entry, then this buffer contains a descriptor + * table which we handle as if it's any normal descriptor chain. + */ + if (desc[i].flags & VRING_DESC_F_INDIRECT) { + if (desc[i].len % sizeof(struct vring_desc)) + errx(1, "Invalid size for indirect buffer table"); + + max = desc[i].len / sizeof(struct vring_desc); + desc = check_pointer(desc[i].addr, desc[i].len); + i = 0; + } + + do { + /* Grab the first descriptor, and check it's OK. */ + iov[*out_num + *in_num].iov_len = desc[i].len; + iov[*out_num + *in_num].iov_base + = check_pointer(desc[i].addr, desc[i].len); + /* If this is an input descriptor, increment that count. */ + if (desc[i].flags & VRING_DESC_F_WRITE) + (*in_num)++; + else { + /* + * If it's an output descriptor, they're all supposed + * to come before any input descriptors. + */ + if (*in_num) + errx(1, "Descriptor has out after in"); + (*out_num)++; + } + + /* If we've got too many, that implies a descriptor loop. */ + if (*out_num + *in_num > max) + errx(1, "Looped descriptor"); + } while ((i = next_desc(desc, i, max)) != max); + + return head; +} + +/* + * After we've used one of their buffers, we tell the Guest about it. Sometime + * later we'll want to send them an interrupt using trigger_irq(); note that + * wait_for_vq_desc() does that for us if it has to wait. + */ +static void add_used(struct virtqueue *vq, unsigned int head, int len) +{ + struct vring_used_elem *used; + + /* + * The virtqueue contains a ring of used buffers. Get a pointer to the + * next entry in that used ring. + */ + used = &vq->vring.used->ring[vq->vring.used->idx % vq->vring.num]; + used->id = head; + used->len = len; + /* Make sure buffer is written before we update index. */ + wmb(); + vq->vring.used->idx++; + vq->pending_used++; +} + +/* And here's the combo meal deal. Supersize me! */ +static void add_used_and_trigger(struct virtqueue *vq, unsigned head, int len) +{ + add_used(vq, head, len); + trigger_irq(vq); +} + +/* + * The Console + * + * We associate some data with the console for our exit hack. + */ +struct console_abort { + /* How many times have they hit ^C? */ + int count; + /* When did they start? */ + struct timeval start; +}; + +/* This is the routine which handles console input (ie. stdin). */ +static void console_input(struct virtqueue *vq) +{ + int len; + unsigned int head, in_num, out_num; + struct console_abort *abort = vq->dev->priv; + struct iovec iov[vq->vring.num]; + + /* Make sure there's a descriptor available. */ + head = wait_for_vq_desc(vq, iov, &out_num, &in_num); + if (out_num) + errx(1, "Output buffers in console in queue?"); + + /* Read into it. This is where we usually wait. */ + len = readv(STDIN_FILENO, iov, in_num); + if (len <= 0) { + /* Ran out of input? */ + warnx("Failed to get console input, ignoring console."); + /* + * For simplicity, dying threads kill the whole Launcher. So + * just nap here. + */ + for (;;) + pause(); + } + + /* Tell the Guest we used a buffer. */ + add_used_and_trigger(vq, head, len); + + /* + * Three ^C within one second? Exit. + * + * This is such a hack, but works surprisingly well. Each ^C has to + * be in a buffer by itself, so they can't be too fast. But we check + * that we get three within about a second, so they can't be too + * slow. + */ + if (len != 1 || ((char *)iov[0].iov_base)[0] != 3) { + abort->count = 0; + return; + } + + abort->count++; + if (abort->count == 1) + gettimeofday(&abort->start, NULL); + else if (abort->count == 3) { + struct timeval now; + gettimeofday(&now, NULL); + /* Kill all Launcher processes with SIGINT, like normal ^C */ + if (now.tv_sec <= abort->start.tv_sec+1) + kill(0, SIGINT); + abort->count = 0; + } +} + +/* This is the routine which handles console output (ie. stdout). */ +static void console_output(struct virtqueue *vq) +{ + unsigned int head, out, in; + struct iovec iov[vq->vring.num]; + + /* We usually wait in here, for the Guest to give us something. */ + head = wait_for_vq_desc(vq, iov, &out, &in); + if (in) + errx(1, "Input buffers in console output queue?"); + + /* writev can return a partial write, so we loop here. */ + while (!iov_empty(iov, out)) { + int len = writev(STDOUT_FILENO, iov, out); + if (len <= 0) { + warn("Write to stdout gave %i (%d)", len, errno); + break; + } + iov_consume(iov, out, NULL, len); + } + + /* + * We're finished with that buffer: if we're going to sleep, + * wait_for_vq_desc() will prod the Guest with an interrupt. + */ + add_used(vq, head, 0); +} + +/* + * The Network + * + * Handling output for network is also simple: we get all the output buffers + * and write them to /dev/net/tun. + */ +struct net_info { + int tunfd; +}; + +static void net_output(struct virtqueue *vq) +{ + struct net_info *net_info = vq->dev->priv; + unsigned int head, out, in; + struct iovec iov[vq->vring.num]; + + /* We usually wait in here for the Guest to give us a packet. */ + head = wait_for_vq_desc(vq, iov, &out, &in); + if (in) + errx(1, "Input buffers in net output queue?"); + /* + * Send the whole thing through to /dev/net/tun. It expects the exact + * same format: what a coincidence! + */ + if (writev(net_info->tunfd, iov, out) < 0) + warnx("Write to tun failed (%d)?", errno); + + /* + * Done with that one; wait_for_vq_desc() will send the interrupt if + * all packets are processed. + */ + add_used(vq, head, 0); +} + +/* + * Handling network input is a bit trickier, because I've tried to optimize it. + * + * First we have a helper routine which tells is if from this file descriptor + * (ie. the /dev/net/tun device) will block: + */ +static bool will_block(int fd) +{ + fd_set fdset; + struct timeval zero = { 0, 0 }; + FD_ZERO(&fdset); + FD_SET(fd, &fdset); + return select(fd+1, &fdset, NULL, NULL, &zero) != 1; +} + +/* + * This handles packets coming in from the tun device to our Guest. Like all + * service routines, it gets called again as soon as it returns, so you don't + * see a while(1) loop here. + */ +static void net_input(struct virtqueue *vq) +{ + int len; + unsigned int head, out, in; + struct iovec iov[vq->vring.num]; + struct net_info *net_info = vq->dev->priv; + + /* + * Get a descriptor to write an incoming packet into. This will also + * send an interrupt if they're out of descriptors. + */ + head = wait_for_vq_desc(vq, iov, &out, &in); + if (out) + errx(1, "Output buffers in net input queue?"); + + /* + * If it looks like we'll block reading from the tun device, send them + * an interrupt. + */ + if (vq->pending_used && will_block(net_info->tunfd)) + trigger_irq(vq); + + /* + * Read in the packet. This is where we normally wait (when there's no + * incoming network traffic). + */ + len = readv(net_info->tunfd, iov, in); + if (len <= 0) + warn("Failed to read from tun (%d).", errno); + + /* + * Mark that packet buffer as used, but don't interrupt here. We want + * to wait until we've done as much work as we can. + */ + add_used(vq, head, len); +} +/*:*/ + +/* This is the helper to create threads: run the service routine in a loop. */ +static int do_thread(void *_vq) +{ + struct virtqueue *vq = _vq; + + for (;;) + vq->service(vq); + return 0; +} + +/* + * When a child dies, we kill our entire process group with SIGTERM. This + * also has the side effect that the shell restores the console for us! + */ +static void kill_launcher(int signal) +{ + kill(0, SIGTERM); +} + +static void reset_device(struct device *dev) +{ + struct virtqueue *vq; + + verbose("Resetting device %s\n", dev->name); + + /* Clear any features they've acked. */ + memset(get_feature_bits(dev) + dev->feature_len, 0, dev->feature_len); + + /* We're going to be explicitly killing threads, so ignore them. */ + signal(SIGCHLD, SIG_IGN); + + /* Zero out the virtqueues, get rid of their threads */ + for (vq = dev->vq; vq; vq = vq->next) { + if (vq->thread != (pid_t)-1) { + kill(vq->thread, SIGTERM); + waitpid(vq->thread, NULL, 0); + vq->thread = (pid_t)-1; + } + memset(vq->vring.desc, 0, + vring_size(vq->config.num, LGUEST_VRING_ALIGN)); + lg_last_avail(vq) = 0; + } + dev->running = false; + + /* Now we care if threads die. */ + signal(SIGCHLD, (void *)kill_launcher); +} + +/*L:216 + * This actually creates the thread which services the virtqueue for a device. + */ +static void create_thread(struct virtqueue *vq) +{ + /* + * Create stack for thread. Since the stack grows upwards, we point + * the stack pointer to the end of this region. + */ + char *stack = malloc(32768); + unsigned long args[] = { LHREQ_EVENTFD, + vq->config.pfn*getpagesize(), 0 }; + + /* Create a zero-initialized eventfd. */ + vq->eventfd = eventfd(0, 0); + if (vq->eventfd < 0) + err(1, "Creating eventfd"); + args[2] = vq->eventfd; + + /* + * Attach an eventfd to this virtqueue: it will go off when the Guest + * does an LHCALL_NOTIFY for this vq. + */ + if (write(lguest_fd, &args, sizeof(args)) != 0) + err(1, "Attaching eventfd"); + + /* + * CLONE_VM: because it has to access the Guest memory, and SIGCHLD so + * we get a signal if it dies. + */ + vq->thread = clone(do_thread, stack + 32768, CLONE_VM | SIGCHLD, vq); + if (vq->thread == (pid_t)-1) + err(1, "Creating clone"); + + /* We close our local copy now the child has it. */ + close(vq->eventfd); +} + +static void start_device(struct device *dev) +{ + unsigned int i; + struct virtqueue *vq; + + verbose("Device %s OK: offered", dev->name); + for (i = 0; i < dev->feature_len; i++) + verbose(" %02x", get_feature_bits(dev)[i]); + verbose(", accepted"); + for (i = 0; i < dev->feature_len; i++) + verbose(" %02x", get_feature_bits(dev) + [dev->feature_len+i]); + + for (vq = dev->vq; vq; vq = vq->next) { + if (vq->service) + create_thread(vq); + } + dev->running = true; +} + +static void cleanup_devices(void) +{ + struct device *dev; + + for (dev = devices.dev; dev; dev = dev->next) + reset_device(dev); + + /* If we saved off the original terminal settings, restore them now. */ + if (orig_term.c_lflag & (ISIG|ICANON|ECHO)) + tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); +} + +/* When the Guest tells us they updated the status field, we handle it. */ +static void update_device_status(struct device *dev) +{ + /* A zero status is a reset, otherwise it's a set of flags. */ + if (dev->desc->status == 0) + reset_device(dev); + else if (dev->desc->status & VIRTIO_CONFIG_S_FAILED) { + warnx("Device %s configuration FAILED", dev->name); + if (dev->running) + reset_device(dev); + } else { + if (dev->running) + err(1, "Device %s features finalized twice", dev->name); + start_device(dev); + } +} + +/*L:215 + * This is the generic routine we call when the Guest uses LHCALL_NOTIFY. In + * particular, it's used to notify us of device status changes during boot. + */ +static void handle_output(unsigned long addr) +{ + struct device *i; + + /* Check each device. */ + for (i = devices.dev; i; i = i->next) { + struct virtqueue *vq; + + /* + * Notifications to device descriptors mean they updated the + * device status. + */ + if (from_guest_phys(addr) == i->desc) { + update_device_status(i); + return; + } + + /* Devices should not be used before features are finalized. */ + for (vq = i->vq; vq; vq = vq->next) { + if (addr != vq->config.pfn*getpagesize()) + continue; + errx(1, "Notification on %s before setup!", i->name); + } + } + + /* + * Early console write is done using notify on a nul-terminated string + * in Guest memory. It's also great for hacking debugging messages + * into a Guest. + */ + if (addr >= guest_limit) + errx(1, "Bad NOTIFY %#lx", addr); + + write(STDOUT_FILENO, from_guest_phys(addr), + strnlen(from_guest_phys(addr), guest_limit - addr)); +} + +/*L:190 + * Device Setup + * + * All devices need a descriptor so the Guest knows it exists, and a "struct + * device" so the Launcher can keep track of it. We have common helper + * routines to allocate and manage them. + */ + +/* + * The layout of the device page is a "struct lguest_device_desc" followed by a + * number of virtqueue descriptors, then two sets of feature bits, then an + * array of configuration bytes. This routine returns the configuration + * pointer. + */ +static u8 *device_config(const struct device *dev) +{ + return (void *)(dev->desc + 1) + + dev->num_vq * sizeof(struct lguest_vqconfig) + + dev->feature_len * 2; +} + +/* + * This routine allocates a new "struct lguest_device_desc" from descriptor + * table page just above the Guest's normal memory. It returns a pointer to + * that descriptor. + */ +static struct lguest_device_desc *new_dev_desc(u16 type) +{ + struct lguest_device_desc d = { .type = type }; + void *p; + + /* Figure out where the next device config is, based on the last one. */ + if (devices.lastdev) + p = device_config(devices.lastdev) + + devices.lastdev->desc->config_len; + else + p = devices.descpage; + + /* We only have one page for all the descriptors. */ + if (p + sizeof(d) > (void *)devices.descpage + getpagesize()) + errx(1, "Too many devices"); + + /* p might not be aligned, so we memcpy in. */ + return memcpy(p, &d, sizeof(d)); +} + +/* + * Each device descriptor is followed by the description of its virtqueues. We + * specify how many descriptors the virtqueue is to have. + */ +static void add_virtqueue(struct device *dev, unsigned int num_descs, + void (*service)(struct virtqueue *)) +{ + unsigned int pages; + struct virtqueue **i, *vq = malloc(sizeof(*vq)); + void *p; + + /* First we need some memory for this virtqueue. */ + pages = (vring_size(num_descs, LGUEST_VRING_ALIGN) + getpagesize() - 1) + / getpagesize(); + p = get_pages(pages); + + /* Initialize the virtqueue */ + vq->next = NULL; + vq->last_avail_idx = 0; + vq->dev = dev; + + /* + * This is the routine the service thread will run, and its Process ID + * once it's running. + */ + vq->service = service; + vq->thread = (pid_t)-1; + + /* Initialize the configuration. */ + vq->config.num = num_descs; + vq->config.irq = devices.next_irq++; + vq->config.pfn = to_guest_phys(p) / getpagesize(); + + /* Initialize the vring. */ + vring_init(&vq->vring, num_descs, p, LGUEST_VRING_ALIGN); + + /* + * Append virtqueue to this device's descriptor. We use + * device_config() to get the end of the device's current virtqueues; + * we check that we haven't added any config or feature information + * yet, otherwise we'd be overwriting them. + */ + assert(dev->desc->config_len == 0 && dev->desc->feature_len == 0); + memcpy(device_config(dev), &vq->config, sizeof(vq->config)); + dev->num_vq++; + dev->desc->num_vq++; + + verbose("Virtqueue page %#lx\n", to_guest_phys(p)); + + /* + * Add to tail of list, so dev->vq is first vq, dev->vq->next is + * second. + */ + for (i = &dev->vq; *i; i = &(*i)->next); + *i = vq; +} + +/* + * The first half of the feature bitmask is for us to advertise features. The + * second half is for the Guest to accept features. + */ +static void add_feature(struct device *dev, unsigned bit) +{ + u8 *features = get_feature_bits(dev); + + /* We can't extend the feature bits once we've added config bytes */ + if (dev->desc->feature_len <= bit / CHAR_BIT) { + assert(dev->desc->config_len == 0); + dev->feature_len = dev->desc->feature_len = (bit/CHAR_BIT) + 1; + } + + features[bit / CHAR_BIT] |= (1 << (bit % CHAR_BIT)); +} + +/* + * This routine sets the configuration fields for an existing device's + * descriptor. It only works for the last device, but that's OK because that's + * how we use it. + */ +static void set_config(struct device *dev, unsigned len, const void *conf) +{ + /* Check we haven't overflowed our single page. */ + if (device_config(dev) + len > devices.descpage + getpagesize()) + errx(1, "Too many devices"); + + /* Copy in the config information, and store the length. */ + memcpy(device_config(dev), conf, len); + dev->desc->config_len = len; + + /* Size must fit in config_len field (8 bits)! */ + assert(dev->desc->config_len == len); +} + +/* + * This routine does all the creation and setup of a new device, including + * calling new_dev_desc() to allocate the descriptor and device memory. We + * don't actually start the service threads until later. + * + * See what I mean about userspace being boring? + */ +static struct device *new_device(const char *name, u16 type) +{ + struct device *dev = malloc(sizeof(*dev)); + + /* Now we populate the fields one at a time. */ + dev->desc = new_dev_desc(type); + dev->name = name; + dev->vq = NULL; + dev->feature_len = 0; + dev->num_vq = 0; + dev->running = false; + dev->next = NULL; + + /* + * Append to device list. Prepending to a single-linked list is + * easier, but the user expects the devices to be arranged on the bus + * in command-line order. The first network device on the command line + * is eth0, the first block device /dev/vda, etc. + */ + if (devices.lastdev) + devices.lastdev->next = dev; + else + devices.dev = dev; + devices.lastdev = dev; + + return dev; +} + +/* + * Our first setup routine is the console. It's a fairly simple device, but + * UNIX tty handling makes it uglier than it could be. + */ +static void setup_console(void) +{ + struct device *dev; + + /* If we can save the initial standard input settings... */ + if (tcgetattr(STDIN_FILENO, &orig_term) == 0) { + struct termios term = orig_term; + /* + * Then we turn off echo, line buffering and ^C etc: We want a + * raw input stream to the Guest. + */ + term.c_lflag &= ~(ISIG|ICANON|ECHO); + tcsetattr(STDIN_FILENO, TCSANOW, &term); + } + + dev = new_device("console", VIRTIO_ID_CONSOLE); + + /* We store the console state in dev->priv, and initialize it. */ + dev->priv = malloc(sizeof(struct console_abort)); + ((struct console_abort *)dev->priv)->count = 0; + + /* + * The console needs two virtqueues: the input then the output. When + * they put something the input queue, we make sure we're listening to + * stdin. When they put something in the output queue, we write it to + * stdout. + */ + add_virtqueue(dev, VIRTQUEUE_NUM, console_input); + add_virtqueue(dev, VIRTQUEUE_NUM, console_output); + + verbose("device %u: console\n", ++devices.device_num); +} +/*:*/ + +/*M:010 + * Inter-guest networking is an interesting area. Simplest is to have a + * --sharenet= option which opens or creates a named pipe. This can be + * used to send packets to another guest in a 1:1 manner. + * + * More sophisticated is to use one of the tools developed for project like UML + * to do networking. + * + * Faster is to do virtio bonding in kernel. Doing this 1:1 would be + * completely generic ("here's my vring, attach to your vring") and would work + * for any traffic. Of course, namespace and permissions issues need to be + * dealt with. A more sophisticated "multi-channel" virtio_net.c could hide + * multiple inter-guest channels behind one interface, although it would + * require some manner of hotplugging new virtio channels. + * + * Finally, we could use a virtio network switch in the kernel, ie. vhost. +:*/ + +static u32 str2ip(const char *ipaddr) +{ + unsigned int b[4]; + + if (sscanf(ipaddr, "%u.%u.%u.%u", &b[0], &b[1], &b[2], &b[3]) != 4) + errx(1, "Failed to parse IP address '%s'", ipaddr); + return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]; +} + +static void str2mac(const char *macaddr, unsigned char mac[6]) +{ + unsigned int m[6]; + if (sscanf(macaddr, "%02x:%02x:%02x:%02x:%02x:%02x", + &m[0], &m[1], &m[2], &m[3], &m[4], &m[5]) != 6) + errx(1, "Failed to parse mac address '%s'", macaddr); + mac[0] = m[0]; + mac[1] = m[1]; + mac[2] = m[2]; + mac[3] = m[3]; + mac[4] = m[4]; + mac[5] = m[5]; +} + +/* + * This code is "adapted" from libbridge: it attaches the Host end of the + * network device to the bridge device specified by the command line. + * + * This is yet another James Morris contribution (I'm an IP-level guy, so I + * dislike bridging), and I just try not to break it. + */ +static void add_to_bridge(int fd, const char *if_name, const char *br_name) +{ + int ifidx; + struct ifreq ifr; + + if (!*br_name) + errx(1, "must specify bridge name"); + + ifidx = if_nametoindex(if_name); + if (!ifidx) + errx(1, "interface %s does not exist!", if_name); + + strncpy(ifr.ifr_name, br_name, IFNAMSIZ); + ifr.ifr_name[IFNAMSIZ-1] = '\0'; + ifr.ifr_ifindex = ifidx; + if (ioctl(fd, SIOCBRADDIF, &ifr) < 0) + err(1, "can't add %s to bridge %s", if_name, br_name); +} + +/* + * This sets up the Host end of the network device with an IP address, brings + * it up so packets will flow, the copies the MAC address into the hwaddr + * pointer. + */ +static void configure_device(int fd, const char *tapif, u32 ipaddr) +{ + struct ifreq ifr; + struct sockaddr_in sin; + + memset(&ifr, 0, sizeof(ifr)); + strcpy(ifr.ifr_name, tapif); + + /* Don't read these incantations. Just cut & paste them like I did! */ + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(ipaddr); + memcpy(&ifr.ifr_addr, &sin, sizeof(sin)); + if (ioctl(fd, SIOCSIFADDR, &ifr) != 0) + err(1, "Setting %s interface address", tapif); + ifr.ifr_flags = IFF_UP; + if (ioctl(fd, SIOCSIFFLAGS, &ifr) != 0) + err(1, "Bringing interface %s up", tapif); +} + +static int get_tun_device(char tapif[IFNAMSIZ]) +{ + struct ifreq ifr; + int netfd; + + /* Start with this zeroed. Messy but sure. */ + memset(&ifr, 0, sizeof(ifr)); + + /* + * We open the /dev/net/tun device and tell it we want a tap device. A + * tap device is like a tun device, only somehow different. To tell + * the truth, I completely blundered my way through this code, but it + * works now! + */ + netfd = open_or_die("/dev/net/tun", O_RDWR); + ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR; + strcpy(ifr.ifr_name, "tap%d"); + if (ioctl(netfd, TUNSETIFF, &ifr) != 0) + err(1, "configuring /dev/net/tun"); + + if (ioctl(netfd, TUNSETOFFLOAD, + TUN_F_CSUM|TUN_F_TSO4|TUN_F_TSO6|TUN_F_TSO_ECN) != 0) + err(1, "Could not set features for tun device"); + + /* + * We don't need checksums calculated for packets coming in this + * device: trust us! + */ + ioctl(netfd, TUNSETNOCSUM, 1); + + memcpy(tapif, ifr.ifr_name, IFNAMSIZ); + return netfd; +} + +/*L:195 + * Our network is a Host<->Guest network. This can either use bridging or + * routing, but the principle is the same: it uses the "tun" device to inject + * packets into the Host as if they came in from a normal network card. We + * just shunt packets between the Guest and the tun device. + */ +static void setup_tun_net(char *arg) +{ + struct device *dev; + struct net_info *net_info = malloc(sizeof(*net_info)); + int ipfd; + u32 ip = INADDR_ANY; + bool bridging = false; + char tapif[IFNAMSIZ], *p; + struct virtio_net_config conf; + + net_info->tunfd = get_tun_device(tapif); + + /* First we create a new network device. */ + dev = new_device("net", VIRTIO_ID_NET); + dev->priv = net_info; + + /* Network devices need a recv and a send queue, just like console. */ + add_virtqueue(dev, VIRTQUEUE_NUM, net_input); + add_virtqueue(dev, VIRTQUEUE_NUM, net_output); + + /* + * We need a socket to perform the magic network ioctls to bring up the + * tap interface, connect to the bridge etc. Any socket will do! + */ + ipfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); + if (ipfd < 0) + err(1, "opening IP socket"); + + /* If the command line was --tunnet=bridge: do bridging. */ + if (!strncmp(BRIDGE_PFX, arg, strlen(BRIDGE_PFX))) { + arg += strlen(BRIDGE_PFX); + bridging = true; + } + + /* A mac address may follow the bridge name or IP address */ + p = strchr(arg, ':'); + if (p) { + str2mac(p+1, conf.mac); + add_feature(dev, VIRTIO_NET_F_MAC); + *p = '\0'; + } + + /* arg is now either an IP address or a bridge name */ + if (bridging) + add_to_bridge(ipfd, tapif, arg); + else + ip = str2ip(arg); + + /* Set up the tun device. */ + configure_device(ipfd, tapif, ip); + + /* Expect Guest to handle everything except UFO */ + add_feature(dev, VIRTIO_NET_F_CSUM); + add_feature(dev, VIRTIO_NET_F_GUEST_CSUM); + add_feature(dev, VIRTIO_NET_F_GUEST_TSO4); + add_feature(dev, VIRTIO_NET_F_GUEST_TSO6); + add_feature(dev, VIRTIO_NET_F_GUEST_ECN); + add_feature(dev, VIRTIO_NET_F_HOST_TSO4); + add_feature(dev, VIRTIO_NET_F_HOST_TSO6); + add_feature(dev, VIRTIO_NET_F_HOST_ECN); + /* We handle indirect ring entries */ + add_feature(dev, VIRTIO_RING_F_INDIRECT_DESC); + set_config(dev, sizeof(conf), &conf); + + /* We don't need the socket any more; setup is done. */ + close(ipfd); + + devices.device_num++; + + if (bridging) + verbose("device %u: tun %s attached to bridge: %s\n", + devices.device_num, tapif, arg); + else + verbose("device %u: tun %s: %s\n", + devices.device_num, tapif, arg); +} +/*:*/ + +/* This hangs off device->priv. */ +struct vblk_info { + /* The size of the file. */ + off64_t len; + + /* The file descriptor for the file. */ + int fd; + +}; + +/*L:210 + * The Disk + * + * The disk only has one virtqueue, so it only has one thread. It is really + * simple: the Guest asks for a block number and we read or write that position + * in the file. + * + * Before we serviced each virtqueue in a separate thread, that was unacceptably + * slow: the Guest waits until the read is finished before running anything + * else, even if it could have been doing useful work. + * + * We could have used async I/O, except it's reputed to suck so hard that + * characters actually go missing from your code when you try to use it. + */ +static void blk_request(struct virtqueue *vq) +{ + struct vblk_info *vblk = vq->dev->priv; + unsigned int head, out_num, in_num, wlen; + int ret, i; + u8 *in; + struct virtio_blk_outhdr out; + struct iovec iov[vq->vring.num]; + off64_t off; + + /* + * Get the next request, where we normally wait. It triggers the + * interrupt to acknowledge previously serviced requests (if any). + */ + head = wait_for_vq_desc(vq, iov, &out_num, &in_num); + + /* Copy the output header from the front of the iov (adjusts iov) */ + iov_consume(iov, out_num, &out, sizeof(out)); + + /* Find and trim end of iov input array, for our status byte. */ + in = NULL; + for (i = out_num + in_num - 1; i >= out_num; i--) { + if (iov[i].iov_len > 0) { + in = iov[i].iov_base + iov[i].iov_len - 1; + iov[i].iov_len--; + break; + } + } + if (!in) + errx(1, "Bad virtblk cmd with no room for status"); + + /* + * For historical reasons, block operations are expressed in 512 byte + * "sectors". + */ + off = out.sector * 512; + + /* + * In general the virtio block driver is allowed to try SCSI commands. + * It'd be nice if we supported eject, for example, but we don't. + */ + if (out.type & VIRTIO_BLK_T_SCSI_CMD) { + fprintf(stderr, "Scsi commands unsupported\n"); + *in = VIRTIO_BLK_S_UNSUPP; + wlen = sizeof(*in); + } else if (out.type & VIRTIO_BLK_T_OUT) { + /* + * Write + * + * Move to the right location in the block file. This can fail + * if they try to write past end. + */ + if (lseek64(vblk->fd, off, SEEK_SET) != off) + err(1, "Bad seek to sector %llu", out.sector); + + ret = writev(vblk->fd, iov, out_num); + verbose("WRITE to sector %llu: %i\n", out.sector, ret); + + /* + * Grr... Now we know how long the descriptor they sent was, we + * make sure they didn't try to write over the end of the block + * file (possibly extending it). + */ + if (ret > 0 && off + ret > vblk->len) { + /* Trim it back to the correct length */ + ftruncate64(vblk->fd, vblk->len); + /* Die, bad Guest, die. */ + errx(1, "Write past end %llu+%u", off, ret); + } + + wlen = sizeof(*in); + *in = (ret >= 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR); + } else if (out.type & VIRTIO_BLK_T_FLUSH) { + /* Flush */ + ret = fdatasync(vblk->fd); + verbose("FLUSH fdatasync: %i\n", ret); + wlen = sizeof(*in); + *in = (ret >= 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR); + } else { + /* + * Read + * + * Move to the right location in the block file. This can fail + * if they try to read past end. + */ + if (lseek64(vblk->fd, off, SEEK_SET) != off) + err(1, "Bad seek to sector %llu", out.sector); + + ret = readv(vblk->fd, iov + out_num, in_num); + if (ret >= 0) { + wlen = sizeof(*in) + ret; + *in = VIRTIO_BLK_S_OK; + } else { + wlen = sizeof(*in); + *in = VIRTIO_BLK_S_IOERR; + } + } + + /* Finished that request. */ + add_used(vq, head, wlen); +} + +/*L:198 This actually sets up a virtual block device. */ +static void setup_block_file(const char *filename) +{ + struct device *dev; + struct vblk_info *vblk; + struct virtio_blk_config conf; + + /* Creat the device. */ + dev = new_device("block", VIRTIO_ID_BLOCK); + + /* The device has one virtqueue, where the Guest places requests. */ + add_virtqueue(dev, VIRTQUEUE_NUM, blk_request); + + /* Allocate the room for our own bookkeeping */ + vblk = dev->priv = malloc(sizeof(*vblk)); + + /* First we open the file and store the length. */ + vblk->fd = open_or_die(filename, O_RDWR|O_LARGEFILE); + vblk->len = lseek64(vblk->fd, 0, SEEK_END); + + /* We support FLUSH. */ + add_feature(dev, VIRTIO_BLK_F_FLUSH); + + /* Tell Guest how many sectors this device has. */ + conf.capacity = cpu_to_le64(vblk->len / 512); + + /* + * Tell Guest not to put in too many descriptors at once: two are used + * for the in and out elements. + */ + add_feature(dev, VIRTIO_BLK_F_SEG_MAX); + conf.seg_max = cpu_to_le32(VIRTQUEUE_NUM - 2); + + /* Don't try to put whole struct: we have 8 bit limit. */ + set_config(dev, offsetof(struct virtio_blk_config, geometry), &conf); + + verbose("device %u: virtblock %llu sectors\n", + ++devices.device_num, le64_to_cpu(conf.capacity)); +} + +/*L:211 + * Our random number generator device reads from /dev/random into the Guest's + * input buffers. The usual case is that the Guest doesn't want random numbers + * and so has no buffers although /dev/random is still readable, whereas + * console is the reverse. + * + * The same logic applies, however. + */ +struct rng_info { + int rfd; +}; + +static void rng_input(struct virtqueue *vq) +{ + int len; + unsigned int head, in_num, out_num, totlen = 0; + struct rng_info *rng_info = vq->dev->priv; + struct iovec iov[vq->vring.num]; + + /* First we need a buffer from the Guests's virtqueue. */ + head = wait_for_vq_desc(vq, iov, &out_num, &in_num); + if (out_num) + errx(1, "Output buffers in rng?"); + + /* + * Just like the console write, we loop to cover the whole iovec. + * In this case, short reads actually happen quite a bit. + */ + while (!iov_empty(iov, in_num)) { + len = readv(rng_info->rfd, iov, in_num); + if (len <= 0) + err(1, "Read from /dev/random gave %i", len); + iov_consume(iov, in_num, NULL, len); + totlen += len; + } + + /* Tell the Guest about the new input. */ + add_used(vq, head, totlen); +} + +/*L:199 + * This creates a "hardware" random number device for the Guest. + */ +static void setup_rng(void) +{ + struct device *dev; + struct rng_info *rng_info = malloc(sizeof(*rng_info)); + + /* Our device's privat info simply contains the /dev/random fd. */ + rng_info->rfd = open_or_die("/dev/random", O_RDONLY); + + /* Create the new device. */ + dev = new_device("rng", VIRTIO_ID_RNG); + dev->priv = rng_info; + + /* The device has one virtqueue, where the Guest places inbufs. */ + add_virtqueue(dev, VIRTQUEUE_NUM, rng_input); + + verbose("device %u: rng\n", devices.device_num++); +} +/* That's the end of device setup. */ + +/*L:230 Reboot is pretty easy: clean up and exec() the Launcher afresh. */ +static void __attribute__((noreturn)) restart_guest(void) +{ + unsigned int i; + + /* + * Since we don't track all open fds, we simply close everything beyond + * stderr. + */ + for (i = 3; i < FD_SETSIZE; i++) + close(i); + + /* Reset all the devices (kills all threads). */ + cleanup_devices(); + + execv(main_args[0], main_args); + err(1, "Could not exec %s", main_args[0]); +} + +/*L:220 + * Finally we reach the core of the Launcher which runs the Guest, serves + * its input and output, and finally, lays it to rest. + */ +static void __attribute__((noreturn)) run_guest(void) +{ + for (;;) { + unsigned long notify_addr; + int readval; + + /* We read from the /dev/lguest device to run the Guest. */ + readval = pread(lguest_fd, ¬ify_addr, + sizeof(notify_addr), cpu_id); + + /* One unsigned long means the Guest did HCALL_NOTIFY */ + if (readval == sizeof(notify_addr)) { + verbose("Notify on address %#lx\n", notify_addr); + handle_output(notify_addr); + /* ENOENT means the Guest died. Reading tells us why. */ + } else if (errno == ENOENT) { + char reason[1024] = { 0 }; + pread(lguest_fd, reason, sizeof(reason)-1, cpu_id); + errx(1, "%s", reason); + /* ERESTART means that we need to reboot the guest */ + } else if (errno == ERESTART) { + restart_guest(); + /* Anything else means a bug or incompatible change. */ + } else + err(1, "Running guest failed"); + } +} +/*L:240 + * This is the end of the Launcher. The good news: we are over halfway + * through! The bad news: the most fiendish part of the code still lies ahead + * of us. + * + * Are you ready? Take a deep breath and join me in the core of the Host, in + * "make Host". +:*/ + +static struct option opts[] = { + { "verbose", 0, NULL, 'v' }, + { "tunnet", 1, NULL, 't' }, + { "block", 1, NULL, 'b' }, + { "rng", 0, NULL, 'r' }, + { "initrd", 1, NULL, 'i' }, + { "username", 1, NULL, 'u' }, + { "chroot", 1, NULL, 'c' }, + { NULL }, +}; +static void usage(void) +{ + errx(1, "Usage: lguest [--verbose] " + "[--tunnet=(:|bridge::)\n" + "|--block=|--initrd=]...\n" + " vmlinux [args...]"); +} + +/*L:105 The main routine is where the real work begins: */ +int main(int argc, char *argv[]) +{ + /* Memory, code startpoint and size of the (optional) initrd. */ + unsigned long mem = 0, start, initrd_size = 0; + /* Two temporaries. */ + int i, c; + /* The boot information for the Guest. */ + struct boot_params *boot; + /* If they specify an initrd file to load. */ + const char *initrd_name = NULL; + + /* Password structure for initgroups/setres[gu]id */ + struct passwd *user_details = NULL; + + /* Directory to chroot to */ + char *chroot_path = NULL; + + /* Save the args: we "reboot" by execing ourselves again. */ + main_args = argv; + + /* + * First we initialize the device list. We keep a pointer to the last + * device, and the next interrupt number to use for devices (1: + * remember that 0 is used by the timer). + */ + devices.lastdev = NULL; + devices.next_irq = 1; + + /* We're CPU 0. In fact, that's the only CPU possible right now. */ + cpu_id = 0; + + /* + * We need to know how much memory so we can set up the device + * descriptor and memory pages for the devices as we parse the command + * line. So we quickly look through the arguments to find the amount + * of memory now. + */ + for (i = 1; i < argc; i++) { + if (argv[i][0] != '-') { + mem = atoi(argv[i]) * 1024 * 1024; + /* + * We start by mapping anonymous pages over all of + * guest-physical memory range. This fills it with 0, + * and ensures that the Guest won't be killed when it + * tries to access it. + */ + guest_base = map_zeroed_pages(mem / getpagesize() + + DEVICE_PAGES); + guest_limit = mem; + guest_max = mem + DEVICE_PAGES*getpagesize(); + devices.descpage = get_pages(1); + break; + } + } + + /* The options are fairly straight-forward */ + while ((c = getopt_long(argc, argv, "v", opts, NULL)) != EOF) { + switch (c) { + case 'v': + verbose = true; + break; + case 't': + setup_tun_net(optarg); + break; + case 'b': + setup_block_file(optarg); + break; + case 'r': + setup_rng(); + break; + case 'i': + initrd_name = optarg; + break; + case 'u': + user_details = getpwnam(optarg); + if (!user_details) + err(1, "getpwnam failed, incorrect username?"); + break; + case 'c': + chroot_path = optarg; + break; + default: + warnx("Unknown argument %s", argv[optind]); + usage(); + } + } + /* + * After the other arguments we expect memory and kernel image name, + * followed by command line arguments for the kernel. + */ + if (optind + 2 > argc) + usage(); + + verbose("Guest base is at %p\n", guest_base); + + /* We always have a console device */ + setup_console(); + + /* Now we load the kernel */ + start = load_kernel(open_or_die(argv[optind+1], O_RDONLY)); + + /* Boot information is stashed at physical address 0 */ + boot = from_guest_phys(0); + + /* Map the initrd image if requested (at top of physical memory) */ + if (initrd_name) { + initrd_size = load_initrd(initrd_name, mem); + /* + * These are the location in the Linux boot header where the + * start and size of the initrd are expected to be found. + */ + boot->hdr.ramdisk_image = mem - initrd_size; + boot->hdr.ramdisk_size = initrd_size; + /* The bootloader type 0xFF means "unknown"; that's OK. */ + boot->hdr.type_of_loader = 0xFF; + } + + /* + * The Linux boot header contains an "E820" memory map: ours is a + * simple, single region. + */ + boot->e820_entries = 1; + boot->e820_map[0] = ((struct e820entry) { 0, mem, E820_RAM }); + /* + * The boot header contains a command line pointer: we put the command + * line after the boot header. + */ + boot->hdr.cmd_line_ptr = to_guest_phys(boot + 1); + /* We use a simple helper to copy the arguments separated by spaces. */ + concat((char *)(boot + 1), argv+optind+2); + + /* Set kernel alignment to 16M (CONFIG_PHYSICAL_ALIGN) */ + boot->hdr.kernel_alignment = 0x1000000; + + /* Boot protocol version: 2.07 supports the fields for lguest. */ + boot->hdr.version = 0x207; + + /* The hardware_subarch value of "1" tells the Guest it's an lguest. */ + boot->hdr.hardware_subarch = 1; + + /* Tell the entry path not to try to reload segment registers. */ + boot->hdr.loadflags |= KEEP_SEGMENTS; + + /* We tell the kernel to initialize the Guest. */ + tell_kernel(start); + + /* Ensure that we terminate if a device-servicing child dies. */ + signal(SIGCHLD, kill_launcher); + + /* If we exit via err(), this kills all the threads, restores tty. */ + atexit(cleanup_devices); + + /* If requested, chroot to a directory */ + if (chroot_path) { + if (chroot(chroot_path) != 0) + err(1, "chroot(\"%s\") failed", chroot_path); + + if (chdir("/") != 0) + err(1, "chdir(\"/\") failed"); + + verbose("chroot done\n"); + } + + /* If requested, drop privileges */ + if (user_details) { + uid_t u; + gid_t g; + + u = user_details->pw_uid; + g = user_details->pw_gid; + + if (initgroups(user_details->pw_name, g) != 0) + err(1, "initgroups failed"); + + if (setresgid(g, g, g) != 0) + err(1, "setresgid failed"); + + if (setresuid(u, u, u) != 0) + err(1, "setresuid failed"); + + verbose("Dropping privileges completed\n"); + } + + /* Finally, run the Guest. This doesn't return. */ + run_guest(); +} +/*:*/ + +/*M:999 + * Mastery is done: you now know everything I do. + * + * But surely you have seen code, features and bugs in your wanderings which + * you now yearn to attack? That is the real game, and I look forward to you + * patching and forking lguest into the Your-Name-Here-visor. + * + * Farewell, and good coding! + * Rusty Russell. + */ diff --git a/tools/lguest/lguest.txt b/tools/lguest/lguest.txt new file mode 100644 index 00000000..06e1f464 --- /dev/null +++ b/tools/lguest/lguest.txt @@ -0,0 +1,125 @@ + __ + (___()'`; Rusty's Remarkably Unreliable Guide to Lguest + /, /` - or, A Young Coder's Illustrated Hypervisor + \\"--\\ http://lguest.ozlabs.org + +Lguest is designed to be a minimal 32-bit x86 hypervisor for the Linux kernel, +for Linux developers and users to experiment with virtualization with the +minimum of complexity. Nonetheless, it should have sufficient features to +make it useful for specific tasks, and, of course, you are encouraged to fork +and enhance it (see drivers/lguest/README). + +Features: + +- Kernel module which runs in a normal kernel. +- Simple I/O model for communication. +- Simple program to create new guests. +- Logo contains cute puppies: http://lguest.ozlabs.org + +Developer features: + +- Fun to hack on. +- No ABI: being tied to a specific kernel anyway, you can change anything. +- Many opportunities for improvement or feature implementation. + +Running Lguest: + +- The easiest way to run lguest is to use same kernel as guest and host. + You can configure them differently, but usually it's easiest not to. + + You will need to configure your kernel with the following options: + + "Processor type and features": + "Paravirtualized guest support" = Y + "Lguest guest support" = Y + "High Memory Support" = off/4GB + "Alignment value to which kernel should be aligned" = 0x100000 + (CONFIG_PARAVIRT=y, CONFIG_LGUEST_GUEST=y, CONFIG_HIGHMEM64G=n and + CONFIG_PHYSICAL_ALIGN=0x100000) + + "Device Drivers": + "Block devices" + "Virtio block driver" = M/Y + "Network device support" + "Universal TUN/TAP device driver support" = M/Y + "Virtio network driver" = M/Y + (CONFIG_VIRTIO_BLK=m, CONFIG_VIRTIO_NET=m and CONFIG_TUN=m) + + "Virtualization" + "Linux hypervisor example code" = M/Y + (CONFIG_LGUEST=m) + +- A tool called "lguest" is available in this directory: type "make" + to build it. If you didn't build your kernel in-tree, use "make + O=". + +- Create or find a root disk image. There are several useful ones + around, such as the xm-test tiny root image at + http://xm-test.xensource.com/ramdisks/initrd-1.1-i386.img + + For more serious work, I usually use a distribution ISO image and + install it under qemu, then make multiple copies: + + dd if=/dev/zero of=rootfile bs=1M count=2048 + qemu -cdrom image.iso -hda rootfile -net user -net nic -boot d + + Make sure that you install a getty on /dev/hvc0 if you want to log in on the + console! + +- "modprobe lg" if you built it as a module. + +- Run an lguest as root: + + tools/lguest/lguest 64 vmlinux --tunnet=192.168.19.1 \ + --block=rootfile root=/dev/vda + + Explanation: + 64: the amount of memory to use, in MB. + + vmlinux: the kernel image found in the top of your build directory. You + can also use a standard bzImage. + + --tunnet=192.168.19.1: configures a "tap" device for networking with this + IP address. + + --block=rootfile: a file or block device which becomes /dev/vda + inside the guest. + + root=/dev/vda: this (and anything else on the command line) are + kernel boot parameters. + +- Configuring networking. I usually have the host masquerade, using + "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE" and "echo 1 > + /proc/sys/net/ipv4/ip_forward". In this example, I would configure + eth0 inside the guest at 192.168.19.2. + + Another method is to bridge the tap device to an external interface + using --tunnet=bridge:, and perhaps run dhcp on the guest + to obtain an IP address. The bridge needs to be configured first: + this option simply adds the tap interface to it. + + A simple example on my system: + + ifconfig eth0 0.0.0.0 + brctl addbr lg0 + ifconfig lg0 up + brctl addif lg0 eth0 + dhclient lg0 + + Then use --tunnet=bridge:lg0 when launching the guest. + + See: + + http://www.linuxfoundation.org/collaborate/workgroups/networking/bridge + + for general information on how to get bridging to work. + +- Random number generation. Using the --rng option will provide a + /dev/hwrng in the guest that will read from the host's /dev/random. + Use this option in conjunction with rng-tools (see ../hw_random.txt) + to provide entropy to the guest kernel's /dev/random. + +There is a helpful mailing list at http://ozlabs.org/mailman/listinfo/lguest + +Good luck! +Rusty Russell rusty@rustcorp.com.au. diff --git a/tools/lib/lk/Makefile b/tools/lib/lk/Makefile new file mode 100644 index 00000000..2c5a1973 --- /dev/null +++ b/tools/lib/lk/Makefile @@ -0,0 +1,38 @@ +include ../../scripts/Makefile.include + +CC = $(CROSS_COMPILE)gcc +AR = $(CROSS_COMPILE)ar + +# guard against environment variables +LIB_H= +LIB_OBJS= + +LIB_H += debugfs.h + +LIB_OBJS += $(OUTPUT)debugfs.o + +LIBFILE = liblk.a + +CFLAGS = -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) -fPIC +EXTLIBS = -lpthread -lrt -lelf -lm +ALL_CFLAGS = $(CFLAGS) $(BASIC_CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 +ALL_LDFLAGS = $(LDFLAGS) + +RM = rm -f + +$(LIBFILE): $(LIB_OBJS) + $(QUIET_AR)$(RM) $@ && $(AR) rcs $(OUTPUT)$@ $(LIB_OBJS) + +$(LIB_OBJS): $(LIB_H) + +$(OUTPUT)%.o: %.c + $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $< +$(OUTPUT)%.s: %.c + $(QUIET_CC)$(CC) -S $(ALL_CFLAGS) $< +$(OUTPUT)%.o: %.S + $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $< + +clean: + $(RM) $(LIB_OBJS) $(LIBFILE) + +.PHONY: clean diff --git a/tools/lib/lk/debugfs.c b/tools/lib/lk/debugfs.c new file mode 100644 index 00000000..7c434796 --- /dev/null +++ b/tools/lib/lk/debugfs.c @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "debugfs.h" + +char debugfs_mountpoint[PATH_MAX + 1] = "/sys/kernel/debug"; + +static const char * const debugfs_known_mountpoints[] = { + "/sys/kernel/debug/", + "/debug/", + 0, +}; + +static bool debugfs_found; + +/* find the path to the mounted debugfs */ +const char *debugfs_find_mountpoint(void) +{ + const char * const *ptr; + char type[100]; + FILE *fp; + + if (debugfs_found) + return (const char *)debugfs_mountpoint; + + ptr = debugfs_known_mountpoints; + while (*ptr) { + if (debugfs_valid_mountpoint(*ptr) == 0) { + debugfs_found = true; + strcpy(debugfs_mountpoint, *ptr); + return debugfs_mountpoint; + } + ptr++; + } + + /* give up and parse /proc/mounts */ + fp = fopen("/proc/mounts", "r"); + if (fp == NULL) + return NULL; + + while (fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n", + debugfs_mountpoint, type) == 2) { + if (strcmp(type, "debugfs") == 0) + break; + } + fclose(fp); + + if (strcmp(type, "debugfs") != 0) + return NULL; + + debugfs_found = true; + + return debugfs_mountpoint; +} + +/* verify that a mountpoint is actually a debugfs instance */ + +int debugfs_valid_mountpoint(const char *debugfs) +{ + struct statfs st_fs; + + if (statfs(debugfs, &st_fs) < 0) + return -ENOENT; + else if (st_fs.f_type != (long) DEBUGFS_MAGIC) + return -ENOENT; + + return 0; +} + +/* mount the debugfs somewhere if it's not mounted */ +char *debugfs_mount(const char *mountpoint) +{ + /* see if it's already mounted */ + if (debugfs_find_mountpoint()) + goto out; + + /* if not mounted and no argument */ + if (mountpoint == NULL) { + /* see if environment variable set */ + mountpoint = getenv(PERF_DEBUGFS_ENVIRONMENT); + /* if no environment variable, use default */ + if (mountpoint == NULL) + mountpoint = "/sys/kernel/debug"; + } + + if (mount(NULL, mountpoint, "debugfs", 0, NULL) < 0) + return NULL; + + /* save the mountpoint */ + debugfs_found = true; + strncpy(debugfs_mountpoint, mountpoint, sizeof(debugfs_mountpoint)); +out: + return debugfs_mountpoint; +} diff --git a/tools/lib/lk/debugfs.h b/tools/lib/lk/debugfs.h new file mode 100644 index 00000000..935c59bd --- /dev/null +++ b/tools/lib/lk/debugfs.h @@ -0,0 +1,29 @@ +#ifndef __LK_DEBUGFS_H__ +#define __LK_DEBUGFS_H__ + +#define _STR(x) #x +#define STR(x) _STR(x) + +/* + * On most systems would have given us this, but not on some systems + * (e.g. GNU/Hurd). + */ +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif + +#ifndef DEBUGFS_MAGIC +#define DEBUGFS_MAGIC 0x64626720 +#endif + +#ifndef PERF_DEBUGFS_ENVIRONMENT +#define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR" +#endif + +const char *debugfs_find_mountpoint(void); +int debugfs_valid_mountpoint(const char *debugfs); +char *debugfs_mount(const char *mountpoint); + +extern char debugfs_mountpoint[]; + +#endif /* __LK_DEBUGFS_H__ */ diff --git a/tools/lib/traceevent/.gitignore b/tools/lib/traceevent/.gitignore new file mode 100644 index 00000000..35f56be5 --- /dev/null +++ b/tools/lib/traceevent/.gitignore @@ -0,0 +1 @@ +TRACEEVENT-CFLAGS diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile new file mode 100644 index 00000000..0b0a9078 --- /dev/null +++ b/tools/lib/traceevent/Makefile @@ -0,0 +1,319 @@ +# trace-cmd version +EP_VERSION = 1 +EP_PATCHLEVEL = 1 +EP_EXTRAVERSION = 0 + +# file format version +FILE_VERSION = 6 + +MAKEFLAGS += --no-print-directory + + +# Makefiles suck: This macro sets a default value of $(2) for the +# variable named by $(1), unless the variable has been set by +# environment or command line. This is necessary for CC and AR +# because make sets default values, so the simpler ?= approach +# won't work as expected. +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix. +$(call allow-override,CC,$(CROSS_COMPILE)gcc) +$(call allow-override,AR,$(CROSS_COMPILE)ar) + +EXT = -std=gnu99 +INSTALL = install + +# Use DESTDIR for installing into a different root directory. +# This is useful for building a package. The program will be +# installed in this directory as if it was the root directory. +# Then the build tool can move it later. +DESTDIR ?= +DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))' + +prefix ?= /usr/local +bindir_relative = bin +bindir = $(prefix)/$(bindir_relative) +man_dir = $(prefix)/share/man +man_dir_SQ = '$(subst ','\'',$(man_dir))' +html_install = $(prefix)/share/kernelshark/html +html_install_SQ = '$(subst ','\'',$(html_install))' +img_install = $(prefix)/share/kernelshark/html/images +img_install_SQ = '$(subst ','\'',$(img_install))' + +export man_dir man_dir_SQ html_install html_install_SQ INSTALL +export img_install img_install_SQ +export DESTDIR DESTDIR_SQ + +# copy a bit from Linux kbuild + +ifeq ("$(origin V)", "command line") + VERBOSE = $(V) +endif +ifndef VERBOSE + VERBOSE = 0 +endif + +ifeq ("$(origin O)", "command line") + BUILD_OUTPUT := $(O) +endif + +ifeq ($(BUILD_SRC),) +ifneq ($(BUILD_OUTPUT),) + +define build_output + $(if $(VERBOSE:1=),@)$(MAKE) -C $(BUILD_OUTPUT) \ + BUILD_SRC=$(CURDIR) -f $(CURDIR)/Makefile $1 +endef + +saved-output := $(BUILD_OUTPUT) +BUILD_OUTPUT := $(shell cd $(BUILD_OUTPUT) && /bin/pwd) +$(if $(BUILD_OUTPUT),, \ + $(error output directory "$(saved-output)" does not exist)) + +all: sub-make + +gui: force + $(call build_output, all_cmd) + +$(filter-out gui,$(MAKECMDGOALS)): sub-make + +sub-make: force + $(call build_output, $(MAKECMDGOALS)) + + +# Leave processing to above invocation of make +skip-makefile := 1 + +endif # BUILD_OUTPUT +endif # BUILD_SRC + +# We process the rest of the Makefile if this is the final invocation of make +ifeq ($(skip-makefile),) + +srctree := $(if $(BUILD_SRC),$(BUILD_SRC),$(CURDIR)) +objtree := $(CURDIR) +src := $(srctree) +obj := $(objtree) + +export prefix bindir src obj + +# Shell quotes +bindir_SQ = $(subst ','\'',$(bindir)) +bindir_relative_SQ = $(subst ','\'',$(bindir_relative)) + +LIB_FILE = libtraceevent.a libtraceevent.so + +CONFIG_INCLUDES = +CONFIG_LIBS = +CONFIG_FLAGS = + +VERSION = $(EP_VERSION) +PATCHLEVEL = $(EP_PATCHLEVEL) +EXTRAVERSION = $(EP_EXTRAVERSION) + +OBJ = $@ +N = + +export Q VERBOSE + +EVENT_PARSE_VERSION = $(EP_VERSION).$(EP_PATCHLEVEL).$(EP_EXTRAVERSION) + +INCLUDES = -I. $(CONFIG_INCLUDES) + +# Set compile option CFLAGS if not set elsewhere +CFLAGS ?= -g -Wall + +# Append required CFLAGS +override CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ) +override CFLAGS += $(udis86-flags) -D_GNU_SOURCE + +ifeq ($(VERBOSE),1) + Q = + print_compile = + print_app_build = + print_fpic_compile = + print_shared_lib_compile = + print_plugin_obj_compile = + print_plugin_build = + print_install = +else + Q = @ + print_compile = echo ' CC '$(OBJ); + print_app_build = echo ' BUILD '$(OBJ); + print_fpic_compile = echo ' CC FPIC '$(OBJ); + print_shared_lib_compile = echo ' BUILD SHARED LIB '$(OBJ); + print_plugin_obj_compile = echo ' CC PLUGIN OBJ '$(OBJ); + print_plugin_build = echo ' CC PLUGI '$(OBJ); + print_static_lib_build = echo ' BUILD STATIC LIB '$(OBJ); + print_install = echo ' INSTALL '$1' to $(DESTDIR_SQ)$2'; +endif + +do_fpic_compile = \ + ($(print_fpic_compile) \ + $(CC) -c $(CFLAGS) $(EXT) -fPIC $< -o $@) + +do_app_build = \ + ($(print_app_build) \ + $(CC) $^ -rdynamic -o $@ $(CONFIG_LIBS) $(LIBS)) + +do_compile_shared_library = \ + ($(print_shared_lib_compile) \ + $(CC) --shared $^ -o $@) + +do_compile_plugin_obj = \ + ($(print_plugin_obj_compile) \ + $(CC) -c $(CFLAGS) -fPIC -o $@ $<) + +do_plugin_build = \ + ($(print_plugin_build) \ + $(CC) $(CFLAGS) -shared -nostartfiles -o $@ $<) + +do_build_static_lib = \ + ($(print_static_lib_build) \ + $(RM) $@; $(AR) rcs $@ $^) + + +define do_compile + $(print_compile) \ + $(CC) -c $(CFLAGS) $(EXT) $< -o $(obj)/$@; +endef + +$(obj)/%.o: $(src)/%.c + $(Q)$(call do_compile) + +%.o: $(src)/%.c + $(Q)$(call do_compile) + +PEVENT_LIB_OBJS = event-parse.o trace-seq.o parse-filter.o parse-utils.o + +ALL_OBJS = $(PEVENT_LIB_OBJS) + +CMD_TARGETS = $(LIB_FILE) + +TARGETS = $(CMD_TARGETS) + + +all: all_cmd + +all_cmd: $(CMD_TARGETS) + +libtraceevent.so: $(PEVENT_LIB_OBJS) + $(Q)$(do_compile_shared_library) + +libtraceevent.a: $(PEVENT_LIB_OBJS) + $(Q)$(do_build_static_lib) + +$(PEVENT_LIB_OBJS): %.o: $(src)/%.c TRACEEVENT-CFLAGS + $(Q)$(do_fpic_compile) + +define make_version.h + (echo '/* This file is automatically generated. Do not modify. */'; \ + echo \#define VERSION_CODE $(shell \ + expr $(VERSION) \* 256 + $(PATCHLEVEL)); \ + echo '#define EXTRAVERSION ' $(EXTRAVERSION); \ + echo '#define VERSION_STRING "'$(VERSION).$(PATCHLEVEL).$(EXTRAVERSION)'"'; \ + echo '#define FILE_VERSION '$(FILE_VERSION); \ + ) > $1 +endef + +define update_version.h + ($(call make_version.h, $@.tmp); \ + if [ -r $@ ] && cmp -s $@ $@.tmp; then \ + rm -f $@.tmp; \ + else \ + echo ' UPDATE $@'; \ + mv -f $@.tmp $@; \ + fi); +endef + +ep_version.h: force + $(Q)$(N)$(call update_version.h) + +VERSION_FILES = ep_version.h + +define update_dir + (echo $1 > $@.tmp; \ + if [ -r $@ ] && cmp -s $@ $@.tmp; then \ + rm -f $@.tmp; \ + else \ + echo ' UPDATE $@'; \ + mv -f $@.tmp $@; \ + fi); +endef + +## make deps + +all_objs := $(sort $(ALL_OBJS)) +all_deps := $(all_objs:%.o=.%.d) + +# let .d file also depends on the source and header files +define check_deps + @set -e; $(RM) $@; \ + $(CC) -MM $(CFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + $(RM) $@.$$$$ +endef + +$(gui_deps): ks_version.h +$(non_gui_deps): tc_version.h + +$(all_deps): .%.d: $(src)/%.c + $(Q)$(call check_deps) + +$(all_objs) : %.o : .%.d + +dep_includes := $(wildcard $(all_deps)) + +ifneq ($(dep_includes),) + include $(dep_includes) +endif + +### Detect environment changes +TRACK_CFLAGS = $(subst ','\'',$(CFLAGS)):$(ARCH):$(CROSS_COMPILE) + +TRACEEVENT-CFLAGS: force + @FLAGS='$(TRACK_CFLAGS)'; \ + if test x"$$FLAGS" != x"`cat TRACEEVENT-CFLAGS 2>/dev/null`" ; then \ + echo 1>&2 " * new build flags or cross compiler"; \ + echo "$$FLAGS" >TRACEEVENT-CFLAGS; \ + fi + +tags: force + $(RM) tags + find . -name '*.[ch]' | xargs ctags --extra=+f --c-kinds=+px \ + --regex-c++='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/' + +TAGS: force + $(RM) TAGS + find . -name '*.[ch]' | xargs etags \ + --regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/' + +define do_install + $(print_install) \ + if [ ! -d '$(DESTDIR_SQ)$2' ]; then \ + $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2'; \ + fi; \ + $(INSTALL) $1 '$(DESTDIR_SQ)$2' +endef + +install_lib: all_cmd install_plugins install_python + $(Q)$(call do_install,$(LIB_FILE),$(bindir_SQ)) + +install: install_lib + +clean: + $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d + $(RM) TRACEEVENT-CFLAGS tags TAGS + +endif # skip-makefile + +PHONY += force +force: + +# Declare the contents of the .PHONY variable as phony. We keep that +# information in a variable so we can use it in if_changed and friends. +.PHONY: $(PHONY) diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c new file mode 100644 index 00000000..82b0606d --- /dev/null +++ b/tools/lib/traceevent/event-parse.c @@ -0,0 +1,5654 @@ +/* + * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * The parts for function graph printing was taken and modified from the + * Linux Kernel that were written by + * - Copyright (C) 2009 Frederic Weisbecker, + * Frederic Weisbecker gave his permission to relicense the code to + * the Lesser General Public License. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "event-parse.h" +#include "event-utils.h" + +static const char *input_buf; +static unsigned long long input_buf_ptr; +static unsigned long long input_buf_siz; + +static int is_flag_field; +static int is_symbolic_field; + +static int show_warning = 1; + +#define do_warning(fmt, ...) \ + do { \ + if (show_warning) \ + warning(fmt, ##__VA_ARGS__); \ + } while (0) + +static void init_input_buf(const char *buf, unsigned long long size) +{ + input_buf = buf; + input_buf_siz = size; + input_buf_ptr = 0; +} + +const char *pevent_get_input_buf(void) +{ + return input_buf; +} + +unsigned long long pevent_get_input_buf_ptr(void) +{ + return input_buf_ptr; +} + +struct event_handler { + struct event_handler *next; + int id; + const char *sys_name; + const char *event_name; + pevent_event_handler_func func; + void *context; +}; + +struct pevent_func_params { + struct pevent_func_params *next; + enum pevent_func_arg_type type; +}; + +struct pevent_function_handler { + struct pevent_function_handler *next; + enum pevent_func_arg_type ret_type; + char *name; + pevent_func_handler func; + struct pevent_func_params *params; + int nr_args; +}; + +static unsigned long long +process_defined_func(struct trace_seq *s, void *data, int size, + struct event_format *event, struct print_arg *arg); + +static void free_func_handle(struct pevent_function_handler *func); + +/** + * pevent_buffer_init - init buffer for parsing + * @buf: buffer to parse + * @size: the size of the buffer + * + * For use with pevent_read_token(), this initializes the internal + * buffer that pevent_read_token() will parse. + */ +void pevent_buffer_init(const char *buf, unsigned long long size) +{ + init_input_buf(buf, size); +} + +void breakpoint(void) +{ + static int x; + x++; +} + +struct print_arg *alloc_arg(void) +{ + return calloc(1, sizeof(struct print_arg)); +} + +struct cmdline { + char *comm; + int pid; +}; + +static int cmdline_cmp(const void *a, const void *b) +{ + const struct cmdline *ca = a; + const struct cmdline *cb = b; + + if (ca->pid < cb->pid) + return -1; + if (ca->pid > cb->pid) + return 1; + + return 0; +} + +struct cmdline_list { + struct cmdline_list *next; + char *comm; + int pid; +}; + +static int cmdline_init(struct pevent *pevent) +{ + struct cmdline_list *cmdlist = pevent->cmdlist; + struct cmdline_list *item; + struct cmdline *cmdlines; + int i; + + cmdlines = malloc(sizeof(*cmdlines) * pevent->cmdline_count); + if (!cmdlines) + return -1; + + i = 0; + while (cmdlist) { + cmdlines[i].pid = cmdlist->pid; + cmdlines[i].comm = cmdlist->comm; + i++; + item = cmdlist; + cmdlist = cmdlist->next; + free(item); + } + + qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp); + + pevent->cmdlines = cmdlines; + pevent->cmdlist = NULL; + + return 0; +} + +static const char *find_cmdline(struct pevent *pevent, int pid) +{ + const struct cmdline *comm; + struct cmdline key; + + if (!pid) + return ""; + + if (!pevent->cmdlines && cmdline_init(pevent)) + return ""; + + key.pid = pid; + + comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count, + sizeof(*pevent->cmdlines), cmdline_cmp); + + if (comm) + return comm->comm; + return "<...>"; +} + +/** + * pevent_pid_is_registered - return if a pid has a cmdline registered + * @pevent: handle for the pevent + * @pid: The pid to check if it has a cmdline registered with. + * + * Returns 1 if the pid has a cmdline mapped to it + * 0 otherwise. + */ +int pevent_pid_is_registered(struct pevent *pevent, int pid) +{ + const struct cmdline *comm; + struct cmdline key; + + if (!pid) + return 1; + + if (!pevent->cmdlines && cmdline_init(pevent)) + return 0; + + key.pid = pid; + + comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count, + sizeof(*pevent->cmdlines), cmdline_cmp); + + if (comm) + return 1; + return 0; +} + +/* + * If the command lines have been converted to an array, then + * we must add this pid. This is much slower than when cmdlines + * are added before the array is initialized. + */ +static int add_new_comm(struct pevent *pevent, const char *comm, int pid) +{ + struct cmdline *cmdlines = pevent->cmdlines; + const struct cmdline *cmdline; + struct cmdline key; + + if (!pid) + return 0; + + /* avoid duplicates */ + key.pid = pid; + + cmdline = bsearch(&key, pevent->cmdlines, pevent->cmdline_count, + sizeof(*pevent->cmdlines), cmdline_cmp); + if (cmdline) { + errno = EEXIST; + return -1; + } + + cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (pevent->cmdline_count + 1)); + if (!cmdlines) { + errno = ENOMEM; + return -1; + } + + cmdlines[pevent->cmdline_count].comm = strdup(comm); + if (!cmdlines[pevent->cmdline_count].comm) { + free(cmdlines); + errno = ENOMEM; + return -1; + } + + cmdlines[pevent->cmdline_count].pid = pid; + + if (cmdlines[pevent->cmdline_count].comm) + pevent->cmdline_count++; + + qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp); + pevent->cmdlines = cmdlines; + + return 0; +} + +/** + * pevent_register_comm - register a pid / comm mapping + * @pevent: handle for the pevent + * @comm: the command line to register + * @pid: the pid to map the command line to + * + * This adds a mapping to search for command line names with + * a given pid. The comm is duplicated. + */ +int pevent_register_comm(struct pevent *pevent, const char *comm, int pid) +{ + struct cmdline_list *item; + + if (pevent->cmdlines) + return add_new_comm(pevent, comm, pid); + + item = malloc(sizeof(*item)); + if (!item) + return -1; + + item->comm = strdup(comm); + if (!item->comm) { + free(item); + return -1; + } + item->pid = pid; + item->next = pevent->cmdlist; + + pevent->cmdlist = item; + pevent->cmdline_count++; + + return 0; +} + +struct func_map { + unsigned long long addr; + char *func; + char *mod; +}; + +struct func_list { + struct func_list *next; + unsigned long long addr; + char *func; + char *mod; +}; + +static int func_cmp(const void *a, const void *b) +{ + const struct func_map *fa = a; + const struct func_map *fb = b; + + if (fa->addr < fb->addr) + return -1; + if (fa->addr > fb->addr) + return 1; + + return 0; +} + +/* + * We are searching for a record in between, not an exact + * match. + */ +static int func_bcmp(const void *a, const void *b) +{ + const struct func_map *fa = a; + const struct func_map *fb = b; + + if ((fa->addr == fb->addr) || + + (fa->addr > fb->addr && + fa->addr < (fb+1)->addr)) + return 0; + + if (fa->addr < fb->addr) + return -1; + + return 1; +} + +static int func_map_init(struct pevent *pevent) +{ + struct func_list *funclist; + struct func_list *item; + struct func_map *func_map; + int i; + + func_map = malloc(sizeof(*func_map) * (pevent->func_count + 1)); + if (!func_map) + return -1; + + funclist = pevent->funclist; + + i = 0; + while (funclist) { + func_map[i].func = funclist->func; + func_map[i].addr = funclist->addr; + func_map[i].mod = funclist->mod; + i++; + item = funclist; + funclist = funclist->next; + free(item); + } + + qsort(func_map, pevent->func_count, sizeof(*func_map), func_cmp); + + /* + * Add a special record at the end. + */ + func_map[pevent->func_count].func = NULL; + func_map[pevent->func_count].addr = 0; + func_map[pevent->func_count].mod = NULL; + + pevent->func_map = func_map; + pevent->funclist = NULL; + + return 0; +} + +static struct func_map * +find_func(struct pevent *pevent, unsigned long long addr) +{ + struct func_map *func; + struct func_map key; + + if (!pevent->func_map) + func_map_init(pevent); + + key.addr = addr; + + func = bsearch(&key, pevent->func_map, pevent->func_count, + sizeof(*pevent->func_map), func_bcmp); + + return func; +} + +/** + * pevent_find_function - find a function by a given address + * @pevent: handle for the pevent + * @addr: the address to find the function with + * + * Returns a pointer to the function stored that has the given + * address. Note, the address does not have to be exact, it + * will select the function that would contain the address. + */ +const char *pevent_find_function(struct pevent *pevent, unsigned long long addr) +{ + struct func_map *map; + + map = find_func(pevent, addr); + if (!map) + return NULL; + + return map->func; +} + +/** + * pevent_find_function_address - find a function address by a given address + * @pevent: handle for the pevent + * @addr: the address to find the function with + * + * Returns the address the function starts at. This can be used in + * conjunction with pevent_find_function to print both the function + * name and the function offset. + */ +unsigned long long +pevent_find_function_address(struct pevent *pevent, unsigned long long addr) +{ + struct func_map *map; + + map = find_func(pevent, addr); + if (!map) + return 0; + + return map->addr; +} + +/** + * pevent_register_function - register a function with a given address + * @pevent: handle for the pevent + * @function: the function name to register + * @addr: the address the function starts at + * @mod: the kernel module the function may be in (NULL for none) + * + * This registers a function name with an address and module. + * The @func passed in is duplicated. + */ +int pevent_register_function(struct pevent *pevent, char *func, + unsigned long long addr, char *mod) +{ + struct func_list *item = malloc(sizeof(*item)); + + if (!item) + return -1; + + item->next = pevent->funclist; + item->func = strdup(func); + if (!item->func) + goto out_free; + + if (mod) { + item->mod = strdup(mod); + if (!item->mod) + goto out_free_func; + } else + item->mod = NULL; + item->addr = addr; + + pevent->funclist = item; + pevent->func_count++; + + return 0; + +out_free_func: + free(item->func); + item->func = NULL; +out_free: + free(item); + errno = ENOMEM; + return -1; +} + +/** + * pevent_print_funcs - print out the stored functions + * @pevent: handle for the pevent + * + * This prints out the stored functions. + */ +void pevent_print_funcs(struct pevent *pevent) +{ + int i; + + if (!pevent->func_map) + func_map_init(pevent); + + for (i = 0; i < (int)pevent->func_count; i++) { + printf("%016llx %s", + pevent->func_map[i].addr, + pevent->func_map[i].func); + if (pevent->func_map[i].mod) + printf(" [%s]\n", pevent->func_map[i].mod); + else + printf("\n"); + } +} + +struct printk_map { + unsigned long long addr; + char *printk; +}; + +struct printk_list { + struct printk_list *next; + unsigned long long addr; + char *printk; +}; + +static int printk_cmp(const void *a, const void *b) +{ + const struct printk_map *pa = a; + const struct printk_map *pb = b; + + if (pa->addr < pb->addr) + return -1; + if (pa->addr > pb->addr) + return 1; + + return 0; +} + +static int printk_map_init(struct pevent *pevent) +{ + struct printk_list *printklist; + struct printk_list *item; + struct printk_map *printk_map; + int i; + + printk_map = malloc(sizeof(*printk_map) * (pevent->printk_count + 1)); + if (!printk_map) + return -1; + + printklist = pevent->printklist; + + i = 0; + while (printklist) { + printk_map[i].printk = printklist->printk; + printk_map[i].addr = printklist->addr; + i++; + item = printklist; + printklist = printklist->next; + free(item); + } + + qsort(printk_map, pevent->printk_count, sizeof(*printk_map), printk_cmp); + + pevent->printk_map = printk_map; + pevent->printklist = NULL; + + return 0; +} + +static struct printk_map * +find_printk(struct pevent *pevent, unsigned long long addr) +{ + struct printk_map *printk; + struct printk_map key; + + if (!pevent->printk_map && printk_map_init(pevent)) + return NULL; + + key.addr = addr; + + printk = bsearch(&key, pevent->printk_map, pevent->printk_count, + sizeof(*pevent->printk_map), printk_cmp); + + return printk; +} + +/** + * pevent_register_print_string - register a string by its address + * @pevent: handle for the pevent + * @fmt: the string format to register + * @addr: the address the string was located at + * + * This registers a string by the address it was stored in the kernel. + * The @fmt passed in is duplicated. + */ +int pevent_register_print_string(struct pevent *pevent, char *fmt, + unsigned long long addr) +{ + struct printk_list *item = malloc(sizeof(*item)); + + if (!item) + return -1; + + item->next = pevent->printklist; + item->addr = addr; + + item->printk = strdup(fmt); + if (!item->printk) + goto out_free; + + pevent->printklist = item; + pevent->printk_count++; + + return 0; + +out_free: + free(item); + errno = ENOMEM; + return -1; +} + +/** + * pevent_print_printk - print out the stored strings + * @pevent: handle for the pevent + * + * This prints the string formats that were stored. + */ +void pevent_print_printk(struct pevent *pevent) +{ + int i; + + if (!pevent->printk_map) + printk_map_init(pevent); + + for (i = 0; i < (int)pevent->printk_count; i++) { + printf("%016llx %s\n", + pevent->printk_map[i].addr, + pevent->printk_map[i].printk); + } +} + +static struct event_format *alloc_event(void) +{ + return calloc(1, sizeof(struct event_format)); +} + +static int add_event(struct pevent *pevent, struct event_format *event) +{ + int i; + struct event_format **events = realloc(pevent->events, sizeof(event) * + (pevent->nr_events + 1)); + if (!events) + return -1; + + pevent->events = events; + + for (i = 0; i < pevent->nr_events; i++) { + if (pevent->events[i]->id > event->id) + break; + } + if (i < pevent->nr_events) + memmove(&pevent->events[i + 1], + &pevent->events[i], + sizeof(event) * (pevent->nr_events - i)); + + pevent->events[i] = event; + pevent->nr_events++; + + event->pevent = pevent; + + return 0; +} + +static int event_item_type(enum event_type type) +{ + switch (type) { + case EVENT_ITEM ... EVENT_SQUOTE: + return 1; + case EVENT_ERROR ... EVENT_DELIM: + default: + return 0; + } +} + +static void free_flag_sym(struct print_flag_sym *fsym) +{ + struct print_flag_sym *next; + + while (fsym) { + next = fsym->next; + free(fsym->value); + free(fsym->str); + free(fsym); + fsym = next; + } +} + +static void free_arg(struct print_arg *arg) +{ + struct print_arg *farg; + + if (!arg) + return; + + switch (arg->type) { + case PRINT_ATOM: + free(arg->atom.atom); + break; + case PRINT_FIELD: + free(arg->field.name); + break; + case PRINT_FLAGS: + free_arg(arg->flags.field); + free(arg->flags.delim); + free_flag_sym(arg->flags.flags); + break; + case PRINT_SYMBOL: + free_arg(arg->symbol.field); + free_flag_sym(arg->symbol.symbols); + break; + case PRINT_HEX: + free_arg(arg->hex.field); + free_arg(arg->hex.size); + break; + case PRINT_TYPE: + free(arg->typecast.type); + free_arg(arg->typecast.item); + break; + case PRINT_STRING: + case PRINT_BSTRING: + free(arg->string.string); + break; + case PRINT_DYNAMIC_ARRAY: + free(arg->dynarray.index); + break; + case PRINT_OP: + free(arg->op.op); + free_arg(arg->op.left); + free_arg(arg->op.right); + break; + case PRINT_FUNC: + while (arg->func.args) { + farg = arg->func.args; + arg->func.args = farg->next; + free_arg(farg); + } + break; + + case PRINT_NULL: + default: + break; + } + + free(arg); +} + +static enum event_type get_type(int ch) +{ + if (ch == '\n') + return EVENT_NEWLINE; + if (isspace(ch)) + return EVENT_SPACE; + if (isalnum(ch) || ch == '_') + return EVENT_ITEM; + if (ch == '\'') + return EVENT_SQUOTE; + if (ch == '"') + return EVENT_DQUOTE; + if (!isprint(ch)) + return EVENT_NONE; + if (ch == '(' || ch == ')' || ch == ',') + return EVENT_DELIM; + + return EVENT_OP; +} + +static int __read_char(void) +{ + if (input_buf_ptr >= input_buf_siz) + return -1; + + return input_buf[input_buf_ptr++]; +} + +static int __peek_char(void) +{ + if (input_buf_ptr >= input_buf_siz) + return -1; + + return input_buf[input_buf_ptr]; +} + +/** + * pevent_peek_char - peek at the next character that will be read + * + * Returns the next character read, or -1 if end of buffer. + */ +int pevent_peek_char(void) +{ + return __peek_char(); +} + +static int extend_token(char **tok, char *buf, int size) +{ + char *newtok = realloc(*tok, size); + + if (!newtok) { + free(*tok); + *tok = NULL; + return -1; + } + + if (!*tok) + strcpy(newtok, buf); + else + strcat(newtok, buf); + *tok = newtok; + + return 0; +} + +static enum event_type force_token(const char *str, char **tok); + +static enum event_type __read_token(char **tok) +{ + char buf[BUFSIZ]; + int ch, last_ch, quote_ch, next_ch; + int i = 0; + int tok_size = 0; + enum event_type type; + + *tok = NULL; + + + ch = __read_char(); + if (ch < 0) + return EVENT_NONE; + + type = get_type(ch); + if (type == EVENT_NONE) + return type; + + buf[i++] = ch; + + switch (type) { + case EVENT_NEWLINE: + case EVENT_DELIM: + if (asprintf(tok, "%c", ch) < 0) + return EVENT_ERROR; + + return type; + + case EVENT_OP: + switch (ch) { + case '-': + next_ch = __peek_char(); + if (next_ch == '>') { + buf[i++] = __read_char(); + break; + } + /* fall through */ + case '+': + case '|': + case '&': + case '>': + case '<': + last_ch = ch; + ch = __peek_char(); + if (ch != last_ch) + goto test_equal; + buf[i++] = __read_char(); + switch (last_ch) { + case '>': + case '<': + goto test_equal; + default: + break; + } + break; + case '!': + case '=': + goto test_equal; + default: /* what should we do instead? */ + break; + } + buf[i] = 0; + *tok = strdup(buf); + return type; + + test_equal: + ch = __peek_char(); + if (ch == '=') + buf[i++] = __read_char(); + goto out; + + case EVENT_DQUOTE: + case EVENT_SQUOTE: + /* don't keep quotes */ + i--; + quote_ch = ch; + last_ch = 0; + concat: + do { + if (i == (BUFSIZ - 1)) { + buf[i] = 0; + tok_size += BUFSIZ; + + if (extend_token(tok, buf, tok_size) < 0) + return EVENT_NONE; + i = 0; + } + last_ch = ch; + ch = __read_char(); + buf[i++] = ch; + /* the '\' '\' will cancel itself */ + if (ch == '\\' && last_ch == '\\') + last_ch = 0; + } while (ch != quote_ch || last_ch == '\\'); + /* remove the last quote */ + i--; + + /* + * For strings (double quotes) check the next token. + * If it is another string, concatinate the two. + */ + if (type == EVENT_DQUOTE) { + unsigned long long save_input_buf_ptr = input_buf_ptr; + + do { + ch = __read_char(); + } while (isspace(ch)); + if (ch == '"') + goto concat; + input_buf_ptr = save_input_buf_ptr; + } + + goto out; + + case EVENT_ERROR ... EVENT_SPACE: + case EVENT_ITEM: + default: + break; + } + + while (get_type(__peek_char()) == type) { + if (i == (BUFSIZ - 1)) { + buf[i] = 0; + tok_size += BUFSIZ; + + if (extend_token(tok, buf, tok_size) < 0) + return EVENT_NONE; + i = 0; + } + ch = __read_char(); + buf[i++] = ch; + } + + out: + buf[i] = 0; + if (extend_token(tok, buf, tok_size + i + 1) < 0) + return EVENT_NONE; + + if (type == EVENT_ITEM) { + /* + * Older versions of the kernel has a bug that + * creates invalid symbols and will break the mac80211 + * parsing. This is a work around to that bug. + * + * See Linux kernel commit: + * 811cb50baf63461ce0bdb234927046131fc7fa8b + */ + if (strcmp(*tok, "LOCAL_PR_FMT") == 0) { + free(*tok); + *tok = NULL; + return force_token("\"\%s\" ", tok); + } else if (strcmp(*tok, "STA_PR_FMT") == 0) { + free(*tok); + *tok = NULL; + return force_token("\" sta:%pM\" ", tok); + } else if (strcmp(*tok, "VIF_PR_FMT") == 0) { + free(*tok); + *tok = NULL; + return force_token("\" vif:%p(%d)\" ", tok); + } + } + + return type; +} + +static enum event_type force_token(const char *str, char **tok) +{ + const char *save_input_buf; + unsigned long long save_input_buf_ptr; + unsigned long long save_input_buf_siz; + enum event_type type; + + /* save off the current input pointers */ + save_input_buf = input_buf; + save_input_buf_ptr = input_buf_ptr; + save_input_buf_siz = input_buf_siz; + + init_input_buf(str, strlen(str)); + + type = __read_token(tok); + + /* reset back to original token */ + input_buf = save_input_buf; + input_buf_ptr = save_input_buf_ptr; + input_buf_siz = save_input_buf_siz; + + return type; +} + +static void free_token(char *tok) +{ + if (tok) + free(tok); +} + +static enum event_type read_token(char **tok) +{ + enum event_type type; + + for (;;) { + type = __read_token(tok); + if (type != EVENT_SPACE) + return type; + + free_token(*tok); + } + + /* not reached */ + *tok = NULL; + return EVENT_NONE; +} + +/** + * pevent_read_token - access to utilites to use the pevent parser + * @tok: The token to return + * + * This will parse tokens from the string given by + * pevent_init_data(). + * + * Returns the token type. + */ +enum event_type pevent_read_token(char **tok) +{ + return read_token(tok); +} + +/** + * pevent_free_token - free a token returned by pevent_read_token + * @token: the token to free + */ +void pevent_free_token(char *token) +{ + free_token(token); +} + +/* no newline */ +static enum event_type read_token_item(char **tok) +{ + enum event_type type; + + for (;;) { + type = __read_token(tok); + if (type != EVENT_SPACE && type != EVENT_NEWLINE) + return type; + free_token(*tok); + *tok = NULL; + } + + /* not reached */ + *tok = NULL; + return EVENT_NONE; +} + +static int test_type(enum event_type type, enum event_type expect) +{ + if (type != expect) { + do_warning("Error: expected type %d but read %d", + expect, type); + return -1; + } + return 0; +} + +static int test_type_token(enum event_type type, const char *token, + enum event_type expect, const char *expect_tok) +{ + if (type != expect) { + do_warning("Error: expected type %d but read %d", + expect, type); + return -1; + } + + if (strcmp(token, expect_tok) != 0) { + do_warning("Error: expected '%s' but read '%s'", + expect_tok, token); + return -1; + } + return 0; +} + +static int __read_expect_type(enum event_type expect, char **tok, int newline_ok) +{ + enum event_type type; + + if (newline_ok) + type = read_token(tok); + else + type = read_token_item(tok); + return test_type(type, expect); +} + +static int read_expect_type(enum event_type expect, char **tok) +{ + return __read_expect_type(expect, tok, 1); +} + +static int __read_expected(enum event_type expect, const char *str, + int newline_ok) +{ + enum event_type type; + char *token; + int ret; + + if (newline_ok) + type = read_token(&token); + else + type = read_token_item(&token); + + ret = test_type_token(type, token, expect, str); + + free_token(token); + + return ret; +} + +static int read_expected(enum event_type expect, const char *str) +{ + return __read_expected(expect, str, 1); +} + +static int read_expected_item(enum event_type expect, const char *str) +{ + return __read_expected(expect, str, 0); +} + +static char *event_read_name(void) +{ + char *token; + + if (read_expected(EVENT_ITEM, "name") < 0) + return NULL; + + if (read_expected(EVENT_OP, ":") < 0) + return NULL; + + if (read_expect_type(EVENT_ITEM, &token) < 0) + goto fail; + + return token; + + fail: + free_token(token); + return NULL; +} + +static int event_read_id(void) +{ + char *token; + int id; + + if (read_expected_item(EVENT_ITEM, "ID") < 0) + return -1; + + if (read_expected(EVENT_OP, ":") < 0) + return -1; + + if (read_expect_type(EVENT_ITEM, &token) < 0) + goto fail; + + id = strtoul(token, NULL, 0); + free_token(token); + return id; + + fail: + free_token(token); + return -1; +} + +static int field_is_string(struct format_field *field) +{ + if ((field->flags & FIELD_IS_ARRAY) && + (strstr(field->type, "char") || strstr(field->type, "u8") || + strstr(field->type, "s8"))) + return 1; + + return 0; +} + +static int field_is_dynamic(struct format_field *field) +{ + if (strncmp(field->type, "__data_loc", 10) == 0) + return 1; + + return 0; +} + +static int field_is_long(struct format_field *field) +{ + /* includes long long */ + if (strstr(field->type, "long")) + return 1; + + return 0; +} + +static unsigned int type_size(const char *name) +{ + /* This covers all FIELD_IS_STRING types. */ + static struct { + const char *type; + unsigned int size; + } table[] = { + { "u8", 1 }, + { "u16", 2 }, + { "u32", 4 }, + { "u64", 8 }, + { "s8", 1 }, + { "s16", 2 }, + { "s32", 4 }, + { "s64", 8 }, + { "char", 1 }, + { }, + }; + int i; + + for (i = 0; table[i].type; i++) { + if (!strcmp(table[i].type, name)) + return table[i].size; + } + + return 0; +} + +static int event_read_fields(struct event_format *event, struct format_field **fields) +{ + struct format_field *field = NULL; + enum event_type type; + char *token; + char *last_token; + int count = 0; + + do { + unsigned int size_dynamic = 0; + + type = read_token(&token); + if (type == EVENT_NEWLINE) { + free_token(token); + return count; + } + + count++; + + if (test_type_token(type, token, EVENT_ITEM, "field")) + goto fail; + free_token(token); + + type = read_token(&token); + /* + * The ftrace fields may still use the "special" name. + * Just ignore it. + */ + if (event->flags & EVENT_FL_ISFTRACE && + type == EVENT_ITEM && strcmp(token, "special") == 0) { + free_token(token); + type = read_token(&token); + } + + if (test_type_token(type, token, EVENT_OP, ":") < 0) + goto fail; + + free_token(token); + if (read_expect_type(EVENT_ITEM, &token) < 0) + goto fail; + + last_token = token; + + field = calloc(1, sizeof(*field)); + if (!field) + goto fail; + + field->event = event; + + /* read the rest of the type */ + for (;;) { + type = read_token(&token); + if (type == EVENT_ITEM || + (type == EVENT_OP && strcmp(token, "*") == 0) || + /* + * Some of the ftrace fields are broken and have + * an illegal "." in them. + */ + (event->flags & EVENT_FL_ISFTRACE && + type == EVENT_OP && strcmp(token, ".") == 0)) { + + if (strcmp(token, "*") == 0) + field->flags |= FIELD_IS_POINTER; + + if (field->type) { + char *new_type; + new_type = realloc(field->type, + strlen(field->type) + + strlen(last_token) + 2); + if (!new_type) { + free(last_token); + goto fail; + } + field->type = new_type; + strcat(field->type, " "); + strcat(field->type, last_token); + free(last_token); + } else + field->type = last_token; + last_token = token; + continue; + } + + break; + } + + if (!field->type) { + do_warning("%s: no type found", __func__); + goto fail; + } + field->name = last_token; + + if (test_type(type, EVENT_OP)) + goto fail; + + if (strcmp(token, "[") == 0) { + enum event_type last_type = type; + char *brackets = token; + char *new_brackets; + int len; + + field->flags |= FIELD_IS_ARRAY; + + type = read_token(&token); + + if (type == EVENT_ITEM) + field->arraylen = strtoul(token, NULL, 0); + else + field->arraylen = 0; + + while (strcmp(token, "]") != 0) { + if (last_type == EVENT_ITEM && + type == EVENT_ITEM) + len = 2; + else + len = 1; + last_type = type; + + new_brackets = realloc(brackets, + strlen(brackets) + + strlen(token) + len); + if (!new_brackets) { + free(brackets); + goto fail; + } + brackets = new_brackets; + if (len == 2) + strcat(brackets, " "); + strcat(brackets, token); + /* We only care about the last token */ + field->arraylen = strtoul(token, NULL, 0); + free_token(token); + type = read_token(&token); + if (type == EVENT_NONE) { + do_warning("failed to find token"); + goto fail; + } + } + + free_token(token); + + new_brackets = realloc(brackets, strlen(brackets) + 2); + if (!new_brackets) { + free(brackets); + goto fail; + } + brackets = new_brackets; + strcat(brackets, "]"); + + /* add brackets to type */ + + type = read_token(&token); + /* + * If the next token is not an OP, then it is of + * the format: type [] item; + */ + if (type == EVENT_ITEM) { + char *new_type; + new_type = realloc(field->type, + strlen(field->type) + + strlen(field->name) + + strlen(brackets) + 2); + if (!new_type) { + free(brackets); + goto fail; + } + field->type = new_type; + strcat(field->type, " "); + strcat(field->type, field->name); + size_dynamic = type_size(field->name); + free_token(field->name); + strcat(field->type, brackets); + field->name = token; + type = read_token(&token); + } else { + char *new_type; + new_type = realloc(field->type, + strlen(field->type) + + strlen(brackets) + 1); + if (!new_type) { + free(brackets); + goto fail; + } + field->type = new_type; + strcat(field->type, brackets); + } + free(brackets); + } + + if (field_is_string(field)) + field->flags |= FIELD_IS_STRING; + if (field_is_dynamic(field)) + field->flags |= FIELD_IS_DYNAMIC; + if (field_is_long(field)) + field->flags |= FIELD_IS_LONG; + + if (test_type_token(type, token, EVENT_OP, ";")) + goto fail; + free_token(token); + + if (read_expected(EVENT_ITEM, "offset") < 0) + goto fail_expect; + + if (read_expected(EVENT_OP, ":") < 0) + goto fail_expect; + + if (read_expect_type(EVENT_ITEM, &token)) + goto fail; + field->offset = strtoul(token, NULL, 0); + free_token(token); + + if (read_expected(EVENT_OP, ";") < 0) + goto fail_expect; + + if (read_expected(EVENT_ITEM, "size") < 0) + goto fail_expect; + + if (read_expected(EVENT_OP, ":") < 0) + goto fail_expect; + + if (read_expect_type(EVENT_ITEM, &token)) + goto fail; + field->size = strtoul(token, NULL, 0); + free_token(token); + + if (read_expected(EVENT_OP, ";") < 0) + goto fail_expect; + + type = read_token(&token); + if (type != EVENT_NEWLINE) { + /* newer versions of the kernel have a "signed" type */ + if (test_type_token(type, token, EVENT_ITEM, "signed")) + goto fail; + + free_token(token); + + if (read_expected(EVENT_OP, ":") < 0) + goto fail_expect; + + if (read_expect_type(EVENT_ITEM, &token)) + goto fail; + + if (strtoul(token, NULL, 0)) + field->flags |= FIELD_IS_SIGNED; + + free_token(token); + if (read_expected(EVENT_OP, ";") < 0) + goto fail_expect; + + if (read_expect_type(EVENT_NEWLINE, &token)) + goto fail; + } + + free_token(token); + + if (field->flags & FIELD_IS_ARRAY) { + if (field->arraylen) + field->elementsize = field->size / field->arraylen; + else if (field->flags & FIELD_IS_DYNAMIC) + field->elementsize = size_dynamic; + else if (field->flags & FIELD_IS_STRING) + field->elementsize = 1; + else if (field->flags & FIELD_IS_LONG) + field->elementsize = event->pevent ? + event->pevent->long_size : + sizeof(long); + } else + field->elementsize = field->size; + + *fields = field; + fields = &field->next; + + } while (1); + + return 0; + +fail: + free_token(token); +fail_expect: + if (field) { + free(field->type); + free(field->name); + free(field); + } + return -1; +} + +static int event_read_format(struct event_format *event) +{ + char *token; + int ret; + + if (read_expected_item(EVENT_ITEM, "format") < 0) + return -1; + + if (read_expected(EVENT_OP, ":") < 0) + return -1; + + if (read_expect_type(EVENT_NEWLINE, &token)) + goto fail; + free_token(token); + + ret = event_read_fields(event, &event->format.common_fields); + if (ret < 0) + return ret; + event->format.nr_common = ret; + + ret = event_read_fields(event, &event->format.fields); + if (ret < 0) + return ret; + event->format.nr_fields = ret; + + return 0; + + fail: + free_token(token); + return -1; +} + +static enum event_type +process_arg_token(struct event_format *event, struct print_arg *arg, + char **tok, enum event_type type); + +static enum event_type +process_arg(struct event_format *event, struct print_arg *arg, char **tok) +{ + enum event_type type; + char *token; + + type = read_token(&token); + *tok = token; + + return process_arg_token(event, arg, tok, type); +} + +static enum event_type +process_op(struct event_format *event, struct print_arg *arg, char **tok); + +static enum event_type +process_cond(struct event_format *event, struct print_arg *top, char **tok) +{ + struct print_arg *arg, *left, *right; + enum event_type type; + char *token = NULL; + + arg = alloc_arg(); + left = alloc_arg(); + right = alloc_arg(); + + if (!arg || !left || !right) { + do_warning("%s: not enough memory!", __func__); + /* arg will be freed at out_free */ + free_arg(left); + free_arg(right); + goto out_free; + } + + arg->type = PRINT_OP; + arg->op.left = left; + arg->op.right = right; + + *tok = NULL; + type = process_arg(event, left, &token); + + again: + /* Handle other operations in the arguments */ + if (type == EVENT_OP && strcmp(token, ":") != 0) { + type = process_op(event, left, &token); + goto again; + } + + if (test_type_token(type, token, EVENT_OP, ":")) + goto out_free; + + arg->op.op = token; + + type = process_arg(event, right, &token); + + top->op.right = arg; + + *tok = token; + return type; + +out_free: + /* Top may point to itself */ + top->op.right = NULL; + free_token(token); + free_arg(arg); + return EVENT_ERROR; +} + +static enum event_type +process_array(struct event_format *event, struct print_arg *top, char **tok) +{ + struct print_arg *arg; + enum event_type type; + char *token = NULL; + + arg = alloc_arg(); + if (!arg) { + do_warning("%s: not enough memory!", __func__); + /* '*tok' is set to top->op.op. No need to free. */ + *tok = NULL; + return EVENT_ERROR; + } + + *tok = NULL; + type = process_arg(event, arg, &token); + if (test_type_token(type, token, EVENT_OP, "]")) + goto out_free; + + top->op.right = arg; + + free_token(token); + type = read_token_item(&token); + *tok = token; + + return type; + +out_free: + free_token(token); + free_arg(arg); + return EVENT_ERROR; +} + +static int get_op_prio(char *op) +{ + if (!op[1]) { + switch (op[0]) { + case '~': + case '!': + return 4; + case '*': + case '/': + case '%': + return 6; + case '+': + case '-': + return 7; + /* '>>' and '<<' are 8 */ + case '<': + case '>': + return 9; + /* '==' and '!=' are 10 */ + case '&': + return 11; + case '^': + return 12; + case '|': + return 13; + case '?': + return 16; + default: + do_warning("unknown op '%c'", op[0]); + return -1; + } + } else { + if (strcmp(op, "++") == 0 || + strcmp(op, "--") == 0) { + return 3; + } else if (strcmp(op, ">>") == 0 || + strcmp(op, "<<") == 0) { + return 8; + } else if (strcmp(op, ">=") == 0 || + strcmp(op, "<=") == 0) { + return 9; + } else if (strcmp(op, "==") == 0 || + strcmp(op, "!=") == 0) { + return 10; + } else if (strcmp(op, "&&") == 0) { + return 14; + } else if (strcmp(op, "||") == 0) { + return 15; + } else { + do_warning("unknown op '%s'", op); + return -1; + } + } +} + +static int set_op_prio(struct print_arg *arg) +{ + + /* single ops are the greatest */ + if (!arg->op.left || arg->op.left->type == PRINT_NULL) + arg->op.prio = 0; + else + arg->op.prio = get_op_prio(arg->op.op); + + return arg->op.prio; +} + +/* Note, *tok does not get freed, but will most likely be saved */ +static enum event_type +process_op(struct event_format *event, struct print_arg *arg, char **tok) +{ + struct print_arg *left, *right = NULL; + enum event_type type; + char *token; + + /* the op is passed in via tok */ + token = *tok; + + if (arg->type == PRINT_OP && !arg->op.left) { + /* handle single op */ + if (token[1]) { + do_warning("bad op token %s", token); + goto out_free; + } + switch (token[0]) { + case '~': + case '!': + case '+': + case '-': + break; + default: + do_warning("bad op token %s", token); + goto out_free; + + } + + /* make an empty left */ + left = alloc_arg(); + if (!left) + goto out_warn_free; + + left->type = PRINT_NULL; + arg->op.left = left; + + right = alloc_arg(); + if (!right) + goto out_warn_free; + + arg->op.right = right; + + /* do not free the token, it belongs to an op */ + *tok = NULL; + type = process_arg(event, right, tok); + + } else if (strcmp(token, "?") == 0) { + + left = alloc_arg(); + if (!left) + goto out_warn_free; + + /* copy the top arg to the left */ + *left = *arg; + + arg->type = PRINT_OP; + arg->op.op = token; + arg->op.left = left; + arg->op.prio = 0; + + /* it will set arg->op.right */ + type = process_cond(event, arg, tok); + + } else if (strcmp(token, ">>") == 0 || + strcmp(token, "<<") == 0 || + strcmp(token, "&") == 0 || + strcmp(token, "|") == 0 || + strcmp(token, "&&") == 0 || + strcmp(token, "||") == 0 || + strcmp(token, "-") == 0 || + strcmp(token, "+") == 0 || + strcmp(token, "*") == 0 || + strcmp(token, "^") == 0 || + strcmp(token, "/") == 0 || + strcmp(token, "<") == 0 || + strcmp(token, ">") == 0 || + strcmp(token, "<=") == 0 || + strcmp(token, ">=") == 0 || + strcmp(token, "==") == 0 || + strcmp(token, "!=") == 0) { + + left = alloc_arg(); + if (!left) + goto out_warn_free; + + /* copy the top arg to the left */ + *left = *arg; + + arg->type = PRINT_OP; + arg->op.op = token; + arg->op.left = left; + arg->op.right = NULL; + + if (set_op_prio(arg) == -1) { + event->flags |= EVENT_FL_FAILED; + /* arg->op.op (= token) will be freed at out_free */ + arg->op.op = NULL; + goto out_free; + } + + type = read_token_item(&token); + *tok = token; + + /* could just be a type pointer */ + if ((strcmp(arg->op.op, "*") == 0) && + type == EVENT_DELIM && (strcmp(token, ")") == 0)) { + char *new_atom; + + if (left->type != PRINT_ATOM) { + do_warning("bad pointer type"); + goto out_free; + } + new_atom = realloc(left->atom.atom, + strlen(left->atom.atom) + 3); + if (!new_atom) + goto out_warn_free; + + left->atom.atom = new_atom; + strcat(left->atom.atom, " *"); + free(arg->op.op); + *arg = *left; + free(left); + + return type; + } + + right = alloc_arg(); + if (!right) + goto out_warn_free; + + type = process_arg_token(event, right, tok, type); + arg->op.right = right; + + } else if (strcmp(token, "[") == 0) { + + left = alloc_arg(); + if (!left) + goto out_warn_free; + + *left = *arg; + + arg->type = PRINT_OP; + arg->op.op = token; + arg->op.left = left; + + arg->op.prio = 0; + + /* it will set arg->op.right */ + type = process_array(event, arg, tok); + + } else { + do_warning("unknown op '%s'", token); + event->flags |= EVENT_FL_FAILED; + /* the arg is now the left side */ + goto out_free; + } + + if (type == EVENT_OP && strcmp(*tok, ":") != 0) { + int prio; + + /* higher prios need to be closer to the root */ + prio = get_op_prio(*tok); + + if (prio > arg->op.prio) + return process_op(event, arg, tok); + + return process_op(event, right, tok); + } + + return type; + +out_warn_free: + do_warning("%s: not enough memory!", __func__); +out_free: + free_token(token); + *tok = NULL; + return EVENT_ERROR; +} + +static enum event_type +process_entry(struct event_format *event __maybe_unused, struct print_arg *arg, + char **tok) +{ + enum event_type type; + char *field; + char *token; + + if (read_expected(EVENT_OP, "->") < 0) + goto out_err; + + if (read_expect_type(EVENT_ITEM, &token) < 0) + goto out_free; + field = token; + + arg->type = PRINT_FIELD; + arg->field.name = field; + + if (is_flag_field) { + arg->field.field = pevent_find_any_field(event, arg->field.name); + arg->field.field->flags |= FIELD_IS_FLAG; + is_flag_field = 0; + } else if (is_symbolic_field) { + arg->field.field = pevent_find_any_field(event, arg->field.name); + arg->field.field->flags |= FIELD_IS_SYMBOLIC; + is_symbolic_field = 0; + } + + type = read_token(&token); + *tok = token; + + return type; + + out_free: + free_token(token); + out_err: + *tok = NULL; + return EVENT_ERROR; +} + +static char *arg_eval (struct print_arg *arg); + +static unsigned long long +eval_type_str(unsigned long long val, const char *type, int pointer) +{ + int sign = 0; + char *ref; + int len; + + len = strlen(type); + + if (pointer) { + + if (type[len-1] != '*') { + do_warning("pointer expected with non pointer type"); + return val; + } + + ref = malloc(len); + if (!ref) { + do_warning("%s: not enough memory!", __func__); + return val; + } + memcpy(ref, type, len); + + /* chop off the " *" */ + ref[len - 2] = 0; + + val = eval_type_str(val, ref, 0); + free(ref); + return val; + } + + /* check if this is a pointer */ + if (type[len - 1] == '*') + return val; + + /* Try to figure out the arg size*/ + if (strncmp(type, "struct", 6) == 0) + /* all bets off */ + return val; + + if (strcmp(type, "u8") == 0) + return val & 0xff; + + if (strcmp(type, "u16") == 0) + return val & 0xffff; + + if (strcmp(type, "u32") == 0) + return val & 0xffffffff; + + if (strcmp(type, "u64") == 0 || + strcmp(type, "s64")) + return val; + + if (strcmp(type, "s8") == 0) + return (unsigned long long)(char)val & 0xff; + + if (strcmp(type, "s16") == 0) + return (unsigned long long)(short)val & 0xffff; + + if (strcmp(type, "s32") == 0) + return (unsigned long long)(int)val & 0xffffffff; + + if (strncmp(type, "unsigned ", 9) == 0) { + sign = 0; + type += 9; + } + + if (strcmp(type, "char") == 0) { + if (sign) + return (unsigned long long)(char)val & 0xff; + else + return val & 0xff; + } + + if (strcmp(type, "short") == 0) { + if (sign) + return (unsigned long long)(short)val & 0xffff; + else + return val & 0xffff; + } + + if (strcmp(type, "int") == 0) { + if (sign) + return (unsigned long long)(int)val & 0xffffffff; + else + return val & 0xffffffff; + } + + return val; +} + +/* + * Try to figure out the type. + */ +static unsigned long long +eval_type(unsigned long long val, struct print_arg *arg, int pointer) +{ + if (arg->type != PRINT_TYPE) { + do_warning("expected type argument"); + return 0; + } + + return eval_type_str(val, arg->typecast.type, pointer); +} + +static int arg_num_eval(struct print_arg *arg, long long *val) +{ + long long left, right; + int ret = 1; + + switch (arg->type) { + case PRINT_ATOM: + *val = strtoll(arg->atom.atom, NULL, 0); + break; + case PRINT_TYPE: + ret = arg_num_eval(arg->typecast.item, val); + if (!ret) + break; + *val = eval_type(*val, arg, 0); + break; + case PRINT_OP: + switch (arg->op.op[0]) { + case '|': + ret = arg_num_eval(arg->op.left, &left); + if (!ret) + break; + ret = arg_num_eval(arg->op.right, &right); + if (!ret) + break; + if (arg->op.op[1]) + *val = left || right; + else + *val = left | right; + break; + case '&': + ret = arg_num_eval(arg->op.left, &left); + if (!ret) + break; + ret = arg_num_eval(arg->op.right, &right); + if (!ret) + break; + if (arg->op.op[1]) + *val = left && right; + else + *val = left & right; + break; + case '<': + ret = arg_num_eval(arg->op.left, &left); + if (!ret) + break; + ret = arg_num_eval(arg->op.right, &right); + if (!ret) + break; + switch (arg->op.op[1]) { + case 0: + *val = left < right; + break; + case '<': + *val = left << right; + break; + case '=': + *val = left <= right; + break; + default: + do_warning("unknown op '%s'", arg->op.op); + ret = 0; + } + break; + case '>': + ret = arg_num_eval(arg->op.left, &left); + if (!ret) + break; + ret = arg_num_eval(arg->op.right, &right); + if (!ret) + break; + switch (arg->op.op[1]) { + case 0: + *val = left > right; + break; + case '>': + *val = left >> right; + break; + case '=': + *val = left >= right; + break; + default: + do_warning("unknown op '%s'", arg->op.op); + ret = 0; + } + break; + case '=': + ret = arg_num_eval(arg->op.left, &left); + if (!ret) + break; + ret = arg_num_eval(arg->op.right, &right); + if (!ret) + break; + + if (arg->op.op[1] != '=') { + do_warning("unknown op '%s'", arg->op.op); + ret = 0; + } else + *val = left == right; + break; + case '!': + ret = arg_num_eval(arg->op.left, &left); + if (!ret) + break; + ret = arg_num_eval(arg->op.right, &right); + if (!ret) + break; + + switch (arg->op.op[1]) { + case '=': + *val = left != right; + break; + default: + do_warning("unknown op '%s'", arg->op.op); + ret = 0; + } + break; + case '-': + /* check for negative */ + if (arg->op.left->type == PRINT_NULL) + left = 0; + else + ret = arg_num_eval(arg->op.left, &left); + if (!ret) + break; + ret = arg_num_eval(arg->op.right, &right); + if (!ret) + break; + *val = left - right; + break; + case '+': + if (arg->op.left->type == PRINT_NULL) + left = 0; + else + ret = arg_num_eval(arg->op.left, &left); + if (!ret) + break; + ret = arg_num_eval(arg->op.right, &right); + if (!ret) + break; + *val = left + right; + break; + default: + do_warning("unknown op '%s'", arg->op.op); + ret = 0; + } + break; + + case PRINT_NULL: + case PRINT_FIELD ... PRINT_SYMBOL: + case PRINT_STRING: + case PRINT_BSTRING: + default: + do_warning("invalid eval type %d", arg->type); + ret = 0; + + } + return ret; +} + +static char *arg_eval (struct print_arg *arg) +{ + long long val; + static char buf[20]; + + switch (arg->type) { + case PRINT_ATOM: + return arg->atom.atom; + case PRINT_TYPE: + return arg_eval(arg->typecast.item); + case PRINT_OP: + if (!arg_num_eval(arg, &val)) + break; + sprintf(buf, "%lld", val); + return buf; + + case PRINT_NULL: + case PRINT_FIELD ... PRINT_SYMBOL: + case PRINT_STRING: + case PRINT_BSTRING: + default: + do_warning("invalid eval type %d", arg->type); + break; + } + + return NULL; +} + +static enum event_type +process_fields(struct event_format *event, struct print_flag_sym **list, char **tok) +{ + enum event_type type; + struct print_arg *arg = NULL; + struct print_flag_sym *field; + char *token = *tok; + char *value; + + do { + free_token(token); + type = read_token_item(&token); + if (test_type_token(type, token, EVENT_OP, "{")) + break; + + arg = alloc_arg(); + if (!arg) + goto out_free; + + free_token(token); + type = process_arg(event, arg, &token); + + if (type == EVENT_OP) + type = process_op(event, arg, &token); + + if (type == EVENT_ERROR) + goto out_free; + + if (test_type_token(type, token, EVENT_DELIM, ",")) + goto out_free; + + field = calloc(1, sizeof(*field)); + if (!field) + goto out_free; + + value = arg_eval(arg); + if (value == NULL) + goto out_free_field; + field->value = strdup(value); + if (field->value == NULL) + goto out_free_field; + + free_arg(arg); + arg = alloc_arg(); + if (!arg) + goto out_free; + + free_token(token); + type = process_arg(event, arg, &token); + if (test_type_token(type, token, EVENT_OP, "}")) + goto out_free_field; + + value = arg_eval(arg); + if (value == NULL) + goto out_free_field; + field->str = strdup(value); + if (field->str == NULL) + goto out_free_field; + free_arg(arg); + arg = NULL; + + *list = field; + list = &field->next; + + free_token(token); + type = read_token_item(&token); + } while (type == EVENT_DELIM && strcmp(token, ",") == 0); + + *tok = token; + return type; + +out_free_field: + free_flag_sym(field); +out_free: + free_arg(arg); + free_token(token); + *tok = NULL; + + return EVENT_ERROR; +} + +static enum event_type +process_flags(struct event_format *event, struct print_arg *arg, char **tok) +{ + struct print_arg *field; + enum event_type type; + char *token; + + memset(arg, 0, sizeof(*arg)); + arg->type = PRINT_FLAGS; + + field = alloc_arg(); + if (!field) { + do_warning("%s: not enough memory!", __func__); + goto out_free; + } + + type = process_arg(event, field, &token); + + /* Handle operations in the first argument */ + while (type == EVENT_OP) + type = process_op(event, field, &token); + + if (test_type_token(type, token, EVENT_DELIM, ",")) + goto out_free_field; + free_token(token); + + arg->flags.field = field; + + type = read_token_item(&token); + if (event_item_type(type)) { + arg->flags.delim = token; + type = read_token_item(&token); + } + + if (test_type_token(type, token, EVENT_DELIM, ",")) + goto out_free; + + type = process_fields(event, &arg->flags.flags, &token); + if (test_type_token(type, token, EVENT_DELIM, ")")) + goto out_free; + + free_token(token); + type = read_token_item(tok); + return type; + +out_free_field: + free_arg(field); +out_free: + free_token(token); + *tok = NULL; + return EVENT_ERROR; +} + +static enum event_type +process_symbols(struct event_format *event, struct print_arg *arg, char **tok) +{ + struct print_arg *field; + enum event_type type; + char *token; + + memset(arg, 0, sizeof(*arg)); + arg->type = PRINT_SYMBOL; + + field = alloc_arg(); + if (!field) { + do_warning("%s: not enough memory!", __func__); + goto out_free; + } + + type = process_arg(event, field, &token); + if (test_type_token(type, token, EVENT_DELIM, ",")) + goto out_free_field; + + arg->symbol.field = field; + + type = process_fields(event, &arg->symbol.symbols, &token); + if (test_type_token(type, token, EVENT_DELIM, ")")) + goto out_free; + + free_token(token); + type = read_token_item(tok); + return type; + +out_free_field: + free_arg(field); +out_free: + free_token(token); + *tok = NULL; + return EVENT_ERROR; +} + +static enum event_type +process_hex(struct event_format *event, struct print_arg *arg, char **tok) +{ + struct print_arg *field; + enum event_type type; + char *token; + + memset(arg, 0, sizeof(*arg)); + arg->type = PRINT_HEX; + + field = alloc_arg(); + if (!field) { + do_warning("%s: not enough memory!", __func__); + goto out_free; + } + + type = process_arg(event, field, &token); + + if (test_type_token(type, token, EVENT_DELIM, ",")) + goto out_free; + + arg->hex.field = field; + + free_token(token); + + field = alloc_arg(); + if (!field) { + do_warning("%s: not enough memory!", __func__); + *tok = NULL; + return EVENT_ERROR; + } + + type = process_arg(event, field, &token); + + if (test_type_token(type, token, EVENT_DELIM, ")")) + goto out_free; + + arg->hex.size = field; + + free_token(token); + type = read_token_item(tok); + return type; + + out_free: + free_arg(field); + free_token(token); + *tok = NULL; + return EVENT_ERROR; +} + +static enum event_type +process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok) +{ + struct format_field *field; + enum event_type type; + char *token; + + memset(arg, 0, sizeof(*arg)); + arg->type = PRINT_DYNAMIC_ARRAY; + + /* + * The item within the parenthesis is another field that holds + * the index into where the array starts. + */ + type = read_token(&token); + *tok = token; + if (type != EVENT_ITEM) + goto out_free; + + /* Find the field */ + + field = pevent_find_field(event, token); + if (!field) + goto out_free; + + arg->dynarray.field = field; + arg->dynarray.index = 0; + + if (read_expected(EVENT_DELIM, ")") < 0) + goto out_free; + + free_token(token); + type = read_token_item(&token); + *tok = token; + if (type != EVENT_OP || strcmp(token, "[") != 0) + return type; + + free_token(token); + arg = alloc_arg(); + if (!arg) { + do_warning("%s: not enough memory!", __func__); + *tok = NULL; + return EVENT_ERROR; + } + + type = process_arg(event, arg, &token); + if (type == EVENT_ERROR) + goto out_free_arg; + + if (!test_type_token(type, token, EVENT_OP, "]")) + goto out_free_arg; + + free_token(token); + type = read_token_item(tok); + return type; + + out_free_arg: + free_arg(arg); + out_free: + free_token(token); + *tok = NULL; + return EVENT_ERROR; +} + +static enum event_type +process_paren(struct event_format *event, struct print_arg *arg, char **tok) +{ + struct print_arg *item_arg; + enum event_type type; + char *token; + + type = process_arg(event, arg, &token); + + if (type == EVENT_ERROR) + goto out_free; + + if (type == EVENT_OP) + type = process_op(event, arg, &token); + + if (type == EVENT_ERROR) + goto out_free; + + if (test_type_token(type, token, EVENT_DELIM, ")")) + goto out_free; + + free_token(token); + type = read_token_item(&token); + + /* + * If the next token is an item or another open paren, then + * this was a typecast. + */ + if (event_item_type(type) || + (type == EVENT_DELIM && strcmp(token, "(") == 0)) { + + /* make this a typecast and contine */ + + /* prevous must be an atom */ + if (arg->type != PRINT_ATOM) { + do_warning("previous needed to be PRINT_ATOM"); + goto out_free; + } + + item_arg = alloc_arg(); + if (!item_arg) { + do_warning("%s: not enough memory!", __func__); + goto out_free; + } + + arg->type = PRINT_TYPE; + arg->typecast.type = arg->atom.atom; + arg->typecast.item = item_arg; + type = process_arg_token(event, item_arg, &token, type); + + } + + *tok = token; + return type; + + out_free: + free_token(token); + *tok = NULL; + return EVENT_ERROR; +} + + +static enum event_type +process_str(struct event_format *event __maybe_unused, struct print_arg *arg, + char **tok) +{ + enum event_type type; + char *token; + + if (read_expect_type(EVENT_ITEM, &token) < 0) + goto out_free; + + arg->type = PRINT_STRING; + arg->string.string = token; + arg->string.offset = -1; + + if (read_expected(EVENT_DELIM, ")") < 0) + goto out_err; + + type = read_token(&token); + *tok = token; + + return type; + + out_free: + free_token(token); + out_err: + *tok = NULL; + return EVENT_ERROR; +} + +static struct pevent_function_handler * +find_func_handler(struct pevent *pevent, char *func_name) +{ + struct pevent_function_handler *func; + + if (!pevent) + return NULL; + + for (func = pevent->func_handlers; func; func = func->next) { + if (strcmp(func->name, func_name) == 0) + break; + } + + return func; +} + +static void remove_func_handler(struct pevent *pevent, char *func_name) +{ + struct pevent_function_handler *func; + struct pevent_function_handler **next; + + next = &pevent->func_handlers; + while ((func = *next)) { + if (strcmp(func->name, func_name) == 0) { + *next = func->next; + free_func_handle(func); + break; + } + next = &func->next; + } +} + +static enum event_type +process_func_handler(struct event_format *event, struct pevent_function_handler *func, + struct print_arg *arg, char **tok) +{ + struct print_arg **next_arg; + struct print_arg *farg; + enum event_type type; + char *token; + const char *test; + int i; + + arg->type = PRINT_FUNC; + arg->func.func = func; + + *tok = NULL; + + next_arg = &(arg->func.args); + for (i = 0; i < func->nr_args; i++) { + farg = alloc_arg(); + if (!farg) { + do_warning("%s: not enough memory!", __func__); + return EVENT_ERROR; + } + + type = process_arg(event, farg, &token); + if (i < (func->nr_args - 1)) + test = ","; + else + test = ")"; + + if (test_type_token(type, token, EVENT_DELIM, test)) { + free_arg(farg); + free_token(token); + return EVENT_ERROR; + } + + *next_arg = farg; + next_arg = &(farg->next); + free_token(token); + } + + type = read_token(&token); + *tok = token; + + return type; +} + +static enum event_type +process_function(struct event_format *event, struct print_arg *arg, + char *token, char **tok) +{ + struct pevent_function_handler *func; + + if (strcmp(token, "__print_flags") == 0) { + free_token(token); + is_flag_field = 1; + return process_flags(event, arg, tok); + } + if (strcmp(token, "__print_symbolic") == 0) { + free_token(token); + is_symbolic_field = 1; + return process_symbols(event, arg, tok); + } + if (strcmp(token, "__print_hex") == 0) { + free_token(token); + return process_hex(event, arg, tok); + } + if (strcmp(token, "__get_str") == 0) { + free_token(token); + return process_str(event, arg, tok); + } + if (strcmp(token, "__get_dynamic_array") == 0) { + free_token(token); + return process_dynamic_array(event, arg, tok); + } + + func = find_func_handler(event->pevent, token); + if (func) { + free_token(token); + return process_func_handler(event, func, arg, tok); + } + + do_warning("function %s not defined", token); + free_token(token); + return EVENT_ERROR; +} + +static enum event_type +process_arg_token(struct event_format *event, struct print_arg *arg, + char **tok, enum event_type type) +{ + char *token; + char *atom; + + token = *tok; + + switch (type) { + case EVENT_ITEM: + if (strcmp(token, "REC") == 0) { + free_token(token); + type = process_entry(event, arg, &token); + break; + } + atom = token; + /* test the next token */ + type = read_token_item(&token); + + /* + * If the next token is a parenthesis, then this + * is a function. + */ + if (type == EVENT_DELIM && strcmp(token, "(") == 0) { + free_token(token); + token = NULL; + /* this will free atom. */ + type = process_function(event, arg, atom, &token); + break; + } + /* atoms can be more than one token long */ + while (type == EVENT_ITEM) { + char *new_atom; + new_atom = realloc(atom, + strlen(atom) + strlen(token) + 2); + if (!new_atom) { + free(atom); + *tok = NULL; + free_token(token); + return EVENT_ERROR; + } + atom = new_atom; + strcat(atom, " "); + strcat(atom, token); + free_token(token); + type = read_token_item(&token); + } + + arg->type = PRINT_ATOM; + arg->atom.atom = atom; + break; + + case EVENT_DQUOTE: + case EVENT_SQUOTE: + arg->type = PRINT_ATOM; + arg->atom.atom = token; + type = read_token_item(&token); + break; + case EVENT_DELIM: + if (strcmp(token, "(") == 0) { + free_token(token); + type = process_paren(event, arg, &token); + break; + } + case EVENT_OP: + /* handle single ops */ + arg->type = PRINT_OP; + arg->op.op = token; + arg->op.left = NULL; + type = process_op(event, arg, &token); + + /* On error, the op is freed */ + if (type == EVENT_ERROR) + arg->op.op = NULL; + + /* return error type if errored */ + break; + + case EVENT_ERROR ... EVENT_NEWLINE: + default: + do_warning("unexpected type %d", type); + return EVENT_ERROR; + } + *tok = token; + + return type; +} + +static int event_read_print_args(struct event_format *event, struct print_arg **list) +{ + enum event_type type = EVENT_ERROR; + struct print_arg *arg; + char *token; + int args = 0; + + do { + if (type == EVENT_NEWLINE) { + type = read_token_item(&token); + continue; + } + + arg = alloc_arg(); + if (!arg) { + do_warning("%s: not enough memory!", __func__); + return -1; + } + + type = process_arg(event, arg, &token); + + if (type == EVENT_ERROR) { + free_token(token); + free_arg(arg); + return -1; + } + + *list = arg; + args++; + + if (type == EVENT_OP) { + type = process_op(event, arg, &token); + free_token(token); + if (type == EVENT_ERROR) { + *list = NULL; + free_arg(arg); + return -1; + } + list = &arg->next; + continue; + } + + if (type == EVENT_DELIM && strcmp(token, ",") == 0) { + free_token(token); + *list = arg; + list = &arg->next; + continue; + } + break; + } while (type != EVENT_NONE); + + if (type != EVENT_NONE && type != EVENT_ERROR) + free_token(token); + + return args; +} + +static int event_read_print(struct event_format *event) +{ + enum event_type type; + char *token; + int ret; + + if (read_expected_item(EVENT_ITEM, "print") < 0) + return -1; + + if (read_expected(EVENT_ITEM, "fmt") < 0) + return -1; + + if (read_expected(EVENT_OP, ":") < 0) + return -1; + + if (read_expect_type(EVENT_DQUOTE, &token) < 0) + goto fail; + + concat: + event->print_fmt.format = token; + event->print_fmt.args = NULL; + + /* ok to have no arg */ + type = read_token_item(&token); + + if (type == EVENT_NONE) + return 0; + + /* Handle concatenation of print lines */ + if (type == EVENT_DQUOTE) { + char *cat; + + if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0) + goto fail; + free_token(token); + free_token(event->print_fmt.format); + event->print_fmt.format = NULL; + token = cat; + goto concat; + } + + if (test_type_token(type, token, EVENT_DELIM, ",")) + goto fail; + + free_token(token); + + ret = event_read_print_args(event, &event->print_fmt.args); + if (ret < 0) + return -1; + + return ret; + + fail: + free_token(token); + return -1; +} + +/** + * pevent_find_common_field - return a common field by event + * @event: handle for the event + * @name: the name of the common field to return + * + * Returns a common field from the event by the given @name. + * This only searchs the common fields and not all field. + */ +struct format_field * +pevent_find_common_field(struct event_format *event, const char *name) +{ + struct format_field *format; + + for (format = event->format.common_fields; + format; format = format->next) { + if (strcmp(format->name, name) == 0) + break; + } + + return format; +} + +/** + * pevent_find_field - find a non-common field + * @event: handle for the event + * @name: the name of the non-common field + * + * Returns a non-common field by the given @name. + * This does not search common fields. + */ +struct format_field * +pevent_find_field(struct event_format *event, const char *name) +{ + struct format_field *format; + + for (format = event->format.fields; + format; format = format->next) { + if (strcmp(format->name, name) == 0) + break; + } + + return format; +} + +/** + * pevent_find_any_field - find any field by name + * @event: handle for the event + * @name: the name of the field + * + * Returns a field by the given @name. + * This searchs the common field names first, then + * the non-common ones if a common one was not found. + */ +struct format_field * +pevent_find_any_field(struct event_format *event, const char *name) +{ + struct format_field *format; + + format = pevent_find_common_field(event, name); + if (format) + return format; + return pevent_find_field(event, name); +} + +/** + * pevent_read_number - read a number from data + * @pevent: handle for the pevent + * @ptr: the raw data + * @size: the size of the data that holds the number + * + * Returns the number (converted to host) from the + * raw data. + */ +unsigned long long pevent_read_number(struct pevent *pevent, + const void *ptr, int size) +{ + switch (size) { + case 1: + return *(unsigned char *)ptr; + case 2: + return data2host2(pevent, ptr); + case 4: + return data2host4(pevent, ptr); + case 8: + return data2host8(pevent, ptr); + default: + /* BUG! */ + return 0; + } +} + +/** + * pevent_read_number_field - read a number from data + * @field: a handle to the field + * @data: the raw data to read + * @value: the value to place the number in + * + * Reads raw data according to a field offset and size, + * and translates it into @value. + * + * Returns 0 on success, -1 otherwise. + */ +int pevent_read_number_field(struct format_field *field, const void *data, + unsigned long long *value) +{ + if (!field) + return -1; + switch (field->size) { + case 1: + case 2: + case 4: + case 8: + *value = pevent_read_number(field->event->pevent, + data + field->offset, field->size); + return 0; + default: + return -1; + } +} + +static int get_common_info(struct pevent *pevent, + const char *type, int *offset, int *size) +{ + struct event_format *event; + struct format_field *field; + + /* + * All events should have the same common elements. + * Pick any event to find where the type is; + */ + if (!pevent->events) { + do_warning("no event_list!"); + return -1; + } + + event = pevent->events[0]; + field = pevent_find_common_field(event, type); + if (!field) + return -1; + + *offset = field->offset; + *size = field->size; + + return 0; +} + +static int __parse_common(struct pevent *pevent, void *data, + int *size, int *offset, const char *name) +{ + int ret; + + if (!*size) { + ret = get_common_info(pevent, name, offset, size); + if (ret < 0) + return ret; + } + return pevent_read_number(pevent, data + *offset, *size); +} + +static int trace_parse_common_type(struct pevent *pevent, void *data) +{ + return __parse_common(pevent, data, + &pevent->type_size, &pevent->type_offset, + "common_type"); +} + +static int parse_common_pid(struct pevent *pevent, void *data) +{ + return __parse_common(pevent, data, + &pevent->pid_size, &pevent->pid_offset, + "common_pid"); +} + +static int parse_common_pc(struct pevent *pevent, void *data) +{ + return __parse_common(pevent, data, + &pevent->pc_size, &pevent->pc_offset, + "common_preempt_count"); +} + +static int parse_common_flags(struct pevent *pevent, void *data) +{ + return __parse_common(pevent, data, + &pevent->flags_size, &pevent->flags_offset, + "common_flags"); +} + +static int parse_common_lock_depth(struct pevent *pevent, void *data) +{ + return __parse_common(pevent, data, + &pevent->ld_size, &pevent->ld_offset, + "common_lock_depth"); +} + +static int parse_common_migrate_disable(struct pevent *pevent, void *data) +{ + return __parse_common(pevent, data, + &pevent->ld_size, &pevent->ld_offset, + "common_migrate_disable"); +} + +static int events_id_cmp(const void *a, const void *b); + +/** + * pevent_find_event - find an event by given id + * @pevent: a handle to the pevent + * @id: the id of the event + * + * Returns an event that has a given @id. + */ +struct event_format *pevent_find_event(struct pevent *pevent, int id) +{ + struct event_format **eventptr; + struct event_format key; + struct event_format *pkey = &key; + + /* Check cache first */ + if (pevent->last_event && pevent->last_event->id == id) + return pevent->last_event; + + key.id = id; + + eventptr = bsearch(&pkey, pevent->events, pevent->nr_events, + sizeof(*pevent->events), events_id_cmp); + + if (eventptr) { + pevent->last_event = *eventptr; + return *eventptr; + } + + return NULL; +} + +/** + * pevent_find_event_by_name - find an event by given name + * @pevent: a handle to the pevent + * @sys: the system name to search for + * @name: the name of the event to search for + * + * This returns an event with a given @name and under the system + * @sys. If @sys is NULL the first event with @name is returned. + */ +struct event_format * +pevent_find_event_by_name(struct pevent *pevent, + const char *sys, const char *name) +{ + struct event_format *event; + int i; + + if (pevent->last_event && + strcmp(pevent->last_event->name, name) == 0 && + (!sys || strcmp(pevent->last_event->system, sys) == 0)) + return pevent->last_event; + + for (i = 0; i < pevent->nr_events; i++) { + event = pevent->events[i]; + if (strcmp(event->name, name) == 0) { + if (!sys) + break; + if (strcmp(event->system, sys) == 0) + break; + } + } + if (i == pevent->nr_events) + event = NULL; + + pevent->last_event = event; + return event; +} + +static unsigned long long +eval_num_arg(void *data, int size, struct event_format *event, struct print_arg *arg) +{ + struct pevent *pevent = event->pevent; + unsigned long long val = 0; + unsigned long long left, right; + struct print_arg *typearg = NULL; + struct print_arg *larg; + unsigned long offset; + unsigned int field_size; + + switch (arg->type) { + case PRINT_NULL: + /* ?? */ + return 0; + case PRINT_ATOM: + return strtoull(arg->atom.atom, NULL, 0); + case PRINT_FIELD: + if (!arg->field.field) { + arg->field.field = pevent_find_any_field(event, arg->field.name); + if (!arg->field.field) + goto out_warning_field; + + } + /* must be a number */ + val = pevent_read_number(pevent, data + arg->field.field->offset, + arg->field.field->size); + break; + case PRINT_FLAGS: + case PRINT_SYMBOL: + case PRINT_HEX: + break; + case PRINT_TYPE: + val = eval_num_arg(data, size, event, arg->typecast.item); + return eval_type(val, arg, 0); + case PRINT_STRING: + case PRINT_BSTRING: + return 0; + case PRINT_FUNC: { + struct trace_seq s; + trace_seq_init(&s); + val = process_defined_func(&s, data, size, event, arg); + trace_seq_destroy(&s); + return val; + } + case PRINT_OP: + if (strcmp(arg->op.op, "[") == 0) { + /* + * Arrays are special, since we don't want + * to read the arg as is. + */ + right = eval_num_arg(data, size, event, arg->op.right); + + /* handle typecasts */ + larg = arg->op.left; + while (larg->type == PRINT_TYPE) { + if (!typearg) + typearg = larg; + larg = larg->typecast.item; + } + + /* Default to long size */ + field_size = pevent->long_size; + + switch (larg->type) { + case PRINT_DYNAMIC_ARRAY: + offset = pevent_read_number(pevent, + data + larg->dynarray.field->offset, + larg->dynarray.field->size); + if (larg->dynarray.field->elementsize) + field_size = larg->dynarray.field->elementsize; + /* + * The actual length of the dynamic array is stored + * in the top half of the field, and the offset + * is in the bottom half of the 32 bit field. + */ + offset &= 0xffff; + offset += right; + break; + case PRINT_FIELD: + if (!larg->field.field) { + larg->field.field = + pevent_find_any_field(event, larg->field.name); + if (!larg->field.field) { + arg = larg; + goto out_warning_field; + } + } + field_size = larg->field.field->elementsize; + offset = larg->field.field->offset + + right * larg->field.field->elementsize; + break; + default: + goto default_op; /* oops, all bets off */ + } + val = pevent_read_number(pevent, + data + offset, field_size); + if (typearg) + val = eval_type(val, typearg, 1); + break; + } else if (strcmp(arg->op.op, "?") == 0) { + left = eval_num_arg(data, size, event, arg->op.left); + arg = arg->op.right; + if (left) + val = eval_num_arg(data, size, event, arg->op.left); + else + val = eval_num_arg(data, size, event, arg->op.right); + break; + } + default_op: + left = eval_num_arg(data, size, event, arg->op.left); + right = eval_num_arg(data, size, event, arg->op.right); + switch (arg->op.op[0]) { + case '!': + switch (arg->op.op[1]) { + case 0: + val = !right; + break; + case '=': + val = left != right; + break; + default: + goto out_warning_op; + } + break; + case '~': + val = ~right; + break; + case '|': + if (arg->op.op[1]) + val = left || right; + else + val = left | right; + break; + case '&': + if (arg->op.op[1]) + val = left && right; + else + val = left & right; + break; + case '<': + switch (arg->op.op[1]) { + case 0: + val = left < right; + break; + case '<': + val = left << right; + break; + case '=': + val = left <= right; + break; + default: + goto out_warning_op; + } + break; + case '>': + switch (arg->op.op[1]) { + case 0: + val = left > right; + break; + case '>': + val = left >> right; + break; + case '=': + val = left >= right; + break; + default: + goto out_warning_op; + } + break; + case '=': + if (arg->op.op[1] != '=') + goto out_warning_op; + + val = left == right; + break; + case '-': + val = left - right; + break; + case '+': + val = left + right; + break; + case '/': + val = left / right; + break; + case '*': + val = left * right; + break; + default: + goto out_warning_op; + } + break; + default: /* not sure what to do there */ + return 0; + } + return val; + +out_warning_op: + do_warning("%s: unknown op '%s'", __func__, arg->op.op); + return 0; + +out_warning_field: + do_warning("%s: field %s not found", __func__, arg->field.name); + return 0; +} + +struct flag { + const char *name; + unsigned long long value; +}; + +static const struct flag flags[] = { + { "HI_SOFTIRQ", 0 }, + { "TIMER_SOFTIRQ", 1 }, + { "NET_TX_SOFTIRQ", 2 }, + { "NET_RX_SOFTIRQ", 3 }, + { "BLOCK_SOFTIRQ", 4 }, + { "BLOCK_IOPOLL_SOFTIRQ", 5 }, + { "TASKLET_SOFTIRQ", 6 }, + { "SCHED_SOFTIRQ", 7 }, + { "HRTIMER_SOFTIRQ", 8 }, + { "RCU_SOFTIRQ", 9 }, + + { "HRTIMER_NORESTART", 0 }, + { "HRTIMER_RESTART", 1 }, +}; + +static unsigned long long eval_flag(const char *flag) +{ + int i; + + /* + * Some flags in the format files do not get converted. + * If the flag is not numeric, see if it is something that + * we already know about. + */ + if (isdigit(flag[0])) + return strtoull(flag, NULL, 0); + + for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++) + if (strcmp(flags[i].name, flag) == 0) + return flags[i].value; + + return 0; +} + +static void print_str_to_seq(struct trace_seq *s, const char *format, + int len_arg, const char *str) +{ + if (len_arg >= 0) + trace_seq_printf(s, format, len_arg, str); + else + trace_seq_printf(s, format, str); +} + +static void print_str_arg(struct trace_seq *s, void *data, int size, + struct event_format *event, const char *format, + int len_arg, struct print_arg *arg) +{ + struct pevent *pevent = event->pevent; + struct print_flag_sym *flag; + struct format_field *field; + unsigned long long val, fval; + unsigned long addr; + char *str; + unsigned char *hex; + int print; + int i, len; + + switch (arg->type) { + case PRINT_NULL: + /* ?? */ + return; + case PRINT_ATOM: + print_str_to_seq(s, format, len_arg, arg->atom.atom); + return; + case PRINT_FIELD: + field = arg->field.field; + if (!field) { + field = pevent_find_any_field(event, arg->field.name); + if (!field) { + str = arg->field.name; + goto out_warning_field; + } + arg->field.field = field; + } + /* Zero sized fields, mean the rest of the data */ + len = field->size ? : size - field->offset; + + /* + * Some events pass in pointers. If this is not an array + * and the size is the same as long_size, assume that it + * is a pointer. + */ + if (!(field->flags & FIELD_IS_ARRAY) && + field->size == pevent->long_size) { + addr = *(unsigned long *)(data + field->offset); + trace_seq_printf(s, "%lx", addr); + break; + } + str = malloc(len + 1); + if (!str) { + do_warning("%s: not enough memory!", __func__); + return; + } + memcpy(str, data + field->offset, len); + str[len] = 0; + print_str_to_seq(s, format, len_arg, str); + free(str); + break; + case PRINT_FLAGS: + val = eval_num_arg(data, size, event, arg->flags.field); + print = 0; + for (flag = arg->flags.flags; flag; flag = flag->next) { + fval = eval_flag(flag->value); + if (!val && !fval) { + print_str_to_seq(s, format, len_arg, flag->str); + break; + } + if (fval && (val & fval) == fval) { + if (print && arg->flags.delim) + trace_seq_puts(s, arg->flags.delim); + print_str_to_seq(s, format, len_arg, flag->str); + print = 1; + val &= ~fval; + } + } + break; + case PRINT_SYMBOL: + val = eval_num_arg(data, size, event, arg->symbol.field); + for (flag = arg->symbol.symbols; flag; flag = flag->next) { + fval = eval_flag(flag->value); + if (val == fval) { + print_str_to_seq(s, format, len_arg, flag->str); + break; + } + } + break; + case PRINT_HEX: + field = arg->hex.field->field.field; + if (!field) { + str = arg->hex.field->field.name; + field = pevent_find_any_field(event, str); + if (!field) + goto out_warning_field; + arg->hex.field->field.field = field; + } + hex = data + field->offset; + len = eval_num_arg(data, size, event, arg->hex.size); + for (i = 0; i < len; i++) { + if (i) + trace_seq_putc(s, ' '); + trace_seq_printf(s, "%02x", hex[i]); + } + break; + + case PRINT_TYPE: + break; + case PRINT_STRING: { + int str_offset; + + if (arg->string.offset == -1) { + struct format_field *f; + + f = pevent_find_any_field(event, arg->string.string); + arg->string.offset = f->offset; + } + str_offset = data2host4(pevent, data + arg->string.offset); + str_offset &= 0xffff; + print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset); + break; + } + case PRINT_BSTRING: + print_str_to_seq(s, format, len_arg, arg->string.string); + break; + case PRINT_OP: + /* + * The only op for string should be ? : + */ + if (arg->op.op[0] != '?') + return; + val = eval_num_arg(data, size, event, arg->op.left); + if (val) + print_str_arg(s, data, size, event, + format, len_arg, arg->op.right->op.left); + else + print_str_arg(s, data, size, event, + format, len_arg, arg->op.right->op.right); + break; + case PRINT_FUNC: + process_defined_func(s, data, size, event, arg); + break; + default: + /* well... */ + break; + } + + return; + +out_warning_field: + do_warning("%s: field %s not found", __func__, arg->field.name); +} + +static unsigned long long +process_defined_func(struct trace_seq *s, void *data, int size, + struct event_format *event, struct print_arg *arg) +{ + struct pevent_function_handler *func_handle = arg->func.func; + struct pevent_func_params *param; + unsigned long long *args; + unsigned long long ret; + struct print_arg *farg; + struct trace_seq str; + struct save_str { + struct save_str *next; + char *str; + } *strings = NULL, *string; + int i; + + if (!func_handle->nr_args) { + ret = (*func_handle->func)(s, NULL); + goto out; + } + + farg = arg->func.args; + param = func_handle->params; + + ret = ULLONG_MAX; + args = malloc(sizeof(*args) * func_handle->nr_args); + if (!args) + goto out; + + for (i = 0; i < func_handle->nr_args; i++) { + switch (param->type) { + case PEVENT_FUNC_ARG_INT: + case PEVENT_FUNC_ARG_LONG: + case PEVENT_FUNC_ARG_PTR: + args[i] = eval_num_arg(data, size, event, farg); + break; + case PEVENT_FUNC_ARG_STRING: + trace_seq_init(&str); + print_str_arg(&str, data, size, event, "%s", -1, farg); + trace_seq_terminate(&str); + string = malloc(sizeof(*string)); + if (!string) { + do_warning("%s(%d): malloc str", __func__, __LINE__); + goto out_free; + } + string->next = strings; + string->str = strdup(str.buffer); + if (!string->str) { + free(string); + do_warning("%s(%d): malloc str", __func__, __LINE__); + goto out_free; + } + args[i] = (uintptr_t)string->str; + strings = string; + trace_seq_destroy(&str); + break; + default: + /* + * Something went totally wrong, this is not + * an input error, something in this code broke. + */ + do_warning("Unexpected end of arguments\n"); + goto out_free; + } + farg = farg->next; + param = param->next; + } + + ret = (*func_handle->func)(s, args); +out_free: + free(args); + while (strings) { + string = strings; + strings = string->next; + free(string->str); + free(string); + } + + out: + /* TBD : handle return type here */ + return ret; +} + +static void free_args(struct print_arg *args) +{ + struct print_arg *next; + + while (args) { + next = args->next; + + free_arg(args); + args = next; + } +} + +static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struct event_format *event) +{ + struct pevent *pevent = event->pevent; + struct format_field *field, *ip_field; + struct print_arg *args, *arg, **next; + unsigned long long ip, val; + char *ptr; + void *bptr; + int vsize; + + field = pevent->bprint_buf_field; + ip_field = pevent->bprint_ip_field; + + if (!field) { + field = pevent_find_field(event, "buf"); + if (!field) { + do_warning("can't find buffer field for binary printk"); + return NULL; + } + ip_field = pevent_find_field(event, "ip"); + if (!ip_field) { + do_warning("can't find ip field for binary printk"); + return NULL; + } + pevent->bprint_buf_field = field; + pevent->bprint_ip_field = ip_field; + } + + ip = pevent_read_number(pevent, data + ip_field->offset, ip_field->size); + + /* + * The first arg is the IP pointer. + */ + args = alloc_arg(); + if (!args) { + do_warning("%s(%d): not enough memory!", __func__, __LINE__); + return NULL; + } + arg = args; + arg->next = NULL; + next = &arg->next; + + arg->type = PRINT_ATOM; + + if (asprintf(&arg->atom.atom, "%lld", ip) < 0) + goto out_free; + + /* skip the first "%pf : " */ + for (ptr = fmt + 6, bptr = data + field->offset; + bptr < data + size && *ptr; ptr++) { + int ls = 0; + + if (*ptr == '%') { + process_again: + ptr++; + switch (*ptr) { + case '%': + break; + case 'l': + ls++; + goto process_again; + case 'L': + ls = 2; + goto process_again; + case '0' ... '9': + goto process_again; + case '.': + goto process_again; + case 'p': + ls = 1; + /* fall through */ + case 'd': + case 'u': + case 'x': + case 'i': + switch (ls) { + case 0: + vsize = 4; + break; + case 1: + vsize = pevent->long_size; + break; + case 2: + vsize = 8; + break; + default: + vsize = ls; /* ? */ + break; + } + /* fall through */ + case '*': + if (*ptr == '*') + vsize = 4; + + /* the pointers are always 4 bytes aligned */ + bptr = (void *)(((unsigned long)bptr + 3) & + ~3); + val = pevent_read_number(pevent, bptr, vsize); + bptr += vsize; + arg = alloc_arg(); + if (!arg) { + do_warning("%s(%d): not enough memory!", + __func__, __LINE__); + goto out_free; + } + arg->next = NULL; + arg->type = PRINT_ATOM; + if (asprintf(&arg->atom.atom, "%lld", val) < 0) { + free(arg); + goto out_free; + } + *next = arg; + next = &arg->next; + /* + * The '*' case means that an arg is used as the length. + * We need to continue to figure out for what. + */ + if (*ptr == '*') + goto process_again; + + break; + case 's': + arg = alloc_arg(); + if (!arg) { + do_warning("%s(%d): not enough memory!", + __func__, __LINE__); + goto out_free; + } + arg->next = NULL; + arg->type = PRINT_BSTRING; + arg->string.string = strdup(bptr); + if (!arg->string.string) + goto out_free; + bptr += strlen(bptr) + 1; + *next = arg; + next = &arg->next; + default: + break; + } + } + } + + return args; + +out_free: + free_args(args); + return NULL; +} + +static char * +get_bprint_format(void *data, int size __maybe_unused, + struct event_format *event) +{ + struct pevent *pevent = event->pevent; + unsigned long long addr; + struct format_field *field; + struct printk_map *printk; + char *format; + char *p; + + field = pevent->bprint_fmt_field; + + if (!field) { + field = pevent_find_field(event, "fmt"); + if (!field) { + do_warning("can't find format field for binary printk"); + return NULL; + } + pevent->bprint_fmt_field = field; + } + + addr = pevent_read_number(pevent, data + field->offset, field->size); + + printk = find_printk(pevent, addr); + if (!printk) { + if (asprintf(&format, "%%pf : (NO FORMAT FOUND at %llx)\n", addr) < 0) + return NULL; + return format; + } + + p = printk->printk; + /* Remove any quotes. */ + if (*p == '"') + p++; + if (asprintf(&format, "%s : %s", "%pf", p) < 0) + return NULL; + /* remove ending quotes and new line since we will add one too */ + p = format + strlen(format) - 1; + if (*p == '"') + *p = 0; + + p -= 2; + if (strcmp(p, "\\n") == 0) + *p = 0; + + return format; +} + +static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size, + struct event_format *event, struct print_arg *arg) +{ + unsigned char *buf; + const char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x"; + + if (arg->type == PRINT_FUNC) { + process_defined_func(s, data, size, event, arg); + return; + } + + if (arg->type != PRINT_FIELD) { + trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", + arg->type); + return; + } + + if (mac == 'm') + fmt = "%.2x%.2x%.2x%.2x%.2x%.2x"; + if (!arg->field.field) { + arg->field.field = + pevent_find_any_field(event, arg->field.name); + if (!arg->field.field) { + do_warning("%s: field %s not found", + __func__, arg->field.name); + return; + } + } + if (arg->field.field->size != 6) { + trace_seq_printf(s, "INVALIDMAC"); + return; + } + buf = data + arg->field.field->offset; + trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); +} + +static int is_printable_array(char *p, unsigned int len) +{ + unsigned int i; + + for (i = 0; i < len && p[i]; i++) + if (!isprint(p[i])) + return 0; + return 1; +} + +static void print_event_fields(struct trace_seq *s, void *data, + int size __maybe_unused, + struct event_format *event) +{ + struct format_field *field; + unsigned long long val; + unsigned int offset, len, i; + + field = event->format.fields; + while (field) { + trace_seq_printf(s, " %s=", field->name); + if (field->flags & FIELD_IS_ARRAY) { + offset = field->offset; + len = field->size; + if (field->flags & FIELD_IS_DYNAMIC) { + val = pevent_read_number(event->pevent, data + offset, len); + offset = val; + len = offset >> 16; + offset &= 0xffff; + } + if (field->flags & FIELD_IS_STRING && + is_printable_array(data + offset, len)) { + trace_seq_printf(s, "%s", (char *)data + offset); + } else { + trace_seq_puts(s, "ARRAY["); + for (i = 0; i < len; i++) { + if (i) + trace_seq_puts(s, ", "); + trace_seq_printf(s, "%02x", + *((unsigned char *)data + offset + i)); + } + trace_seq_putc(s, ']'); + field->flags &= ~FIELD_IS_STRING; + } + } else { + val = pevent_read_number(event->pevent, data + field->offset, + field->size); + if (field->flags & FIELD_IS_POINTER) { + trace_seq_printf(s, "0x%llx", val); + } else if (field->flags & FIELD_IS_SIGNED) { + switch (field->size) { + case 4: + /* + * If field is long then print it in hex. + * A long usually stores pointers. + */ + if (field->flags & FIELD_IS_LONG) + trace_seq_printf(s, "0x%x", (int)val); + else + trace_seq_printf(s, "%d", (int)val); + break; + case 2: + trace_seq_printf(s, "%2d", (short)val); + break; + case 1: + trace_seq_printf(s, "%1d", (char)val); + break; + default: + trace_seq_printf(s, "%lld", val); + } + } else { + if (field->flags & FIELD_IS_LONG) + trace_seq_printf(s, "0x%llx", val); + else + trace_seq_printf(s, "%llu", val); + } + } + field = field->next; + } +} + +static void pretty_print(struct trace_seq *s, void *data, int size, struct event_format *event) +{ + struct pevent *pevent = event->pevent; + struct print_fmt *print_fmt = &event->print_fmt; + struct print_arg *arg = print_fmt->args; + struct print_arg *args = NULL; + const char *ptr = print_fmt->format; + unsigned long long val; + struct func_map *func; + const char *saveptr; + char *bprint_fmt = NULL; + char format[32]; + int show_func; + int len_as_arg; + int len_arg; + int len; + int ls; + + if (event->flags & EVENT_FL_FAILED) { + trace_seq_printf(s, "[FAILED TO PARSE]"); + print_event_fields(s, data, size, event); + return; + } + + if (event->flags & EVENT_FL_ISBPRINT) { + bprint_fmt = get_bprint_format(data, size, event); + args = make_bprint_args(bprint_fmt, data, size, event); + arg = args; + ptr = bprint_fmt; + } + + for (; *ptr; ptr++) { + ls = 0; + if (*ptr == '\\') { + ptr++; + switch (*ptr) { + case 'n': + trace_seq_putc(s, '\n'); + break; + case 't': + trace_seq_putc(s, '\t'); + break; + case 'r': + trace_seq_putc(s, '\r'); + break; + case '\\': + trace_seq_putc(s, '\\'); + break; + default: + trace_seq_putc(s, *ptr); + break; + } + + } else if (*ptr == '%') { + saveptr = ptr; + show_func = 0; + len_as_arg = 0; + cont_process: + ptr++; + switch (*ptr) { + case '%': + trace_seq_putc(s, '%'); + break; + case '#': + /* FIXME: need to handle properly */ + goto cont_process; + case 'h': + ls--; + goto cont_process; + case 'l': + ls++; + goto cont_process; + case 'L': + ls = 2; + goto cont_process; + case '*': + /* The argument is the length. */ + if (!arg) { + do_warning("no argument match"); + event->flags |= EVENT_FL_FAILED; + goto out_failed; + } + len_arg = eval_num_arg(data, size, event, arg); + len_as_arg = 1; + arg = arg->next; + goto cont_process; + case '.': + case 'z': + case 'Z': + case '0' ... '9': + goto cont_process; + case 'p': + if (pevent->long_size == 4) + ls = 1; + else + ls = 2; + + if (*(ptr+1) == 'F' || + *(ptr+1) == 'f') { + ptr++; + show_func = *ptr; + } else if (*(ptr+1) == 'M' || *(ptr+1) == 'm') { + print_mac_arg(s, *(ptr+1), data, size, event, arg); + ptr++; + arg = arg->next; + break; + } + + /* fall through */ + case 'd': + case 'i': + case 'x': + case 'X': + case 'u': + if (!arg) { + do_warning("no argument match"); + event->flags |= EVENT_FL_FAILED; + goto out_failed; + } + + len = ((unsigned long)ptr + 1) - + (unsigned long)saveptr; + + /* should never happen */ + if (len > 31) { + do_warning("bad format!"); + event->flags |= EVENT_FL_FAILED; + len = 31; + } + + memcpy(format, saveptr, len); + format[len] = 0; + + val = eval_num_arg(data, size, event, arg); + arg = arg->next; + + if (show_func) { + func = find_func(pevent, val); + if (func) { + trace_seq_puts(s, func->func); + if (show_func == 'F') + trace_seq_printf(s, + "+0x%llx", + val - func->addr); + break; + } + } + if (pevent->long_size == 8 && ls && + sizeof(long) != 8) { + char *p; + + ls = 2; + /* make %l into %ll */ + p = strchr(format, 'l'); + if (p) + memmove(p+1, p, strlen(p)+1); + else if (strcmp(format, "%p") == 0) + strcpy(format, "0x%llx"); + } + switch (ls) { + case -2: + if (len_as_arg) + trace_seq_printf(s, format, len_arg, (char)val); + else + trace_seq_printf(s, format, (char)val); + break; + case -1: + if (len_as_arg) + trace_seq_printf(s, format, len_arg, (short)val); + else + trace_seq_printf(s, format, (short)val); + break; + case 0: + if (len_as_arg) + trace_seq_printf(s, format, len_arg, (int)val); + else + trace_seq_printf(s, format, (int)val); + break; + case 1: + if (len_as_arg) + trace_seq_printf(s, format, len_arg, (long)val); + else + trace_seq_printf(s, format, (long)val); + break; + case 2: + if (len_as_arg) + trace_seq_printf(s, format, len_arg, + (long long)val); + else + trace_seq_printf(s, format, (long long)val); + break; + default: + do_warning("bad count (%d)", ls); + event->flags |= EVENT_FL_FAILED; + } + break; + case 's': + if (!arg) { + do_warning("no matching argument"); + event->flags |= EVENT_FL_FAILED; + goto out_failed; + } + + len = ((unsigned long)ptr + 1) - + (unsigned long)saveptr; + + /* should never happen */ + if (len > 31) { + do_warning("bad format!"); + event->flags |= EVENT_FL_FAILED; + len = 31; + } + + memcpy(format, saveptr, len); + format[len] = 0; + if (!len_as_arg) + len_arg = -1; + print_str_arg(s, data, size, event, + format, len_arg, arg); + arg = arg->next; + break; + default: + trace_seq_printf(s, ">%c<", *ptr); + + } + } else + trace_seq_putc(s, *ptr); + } + + if (event->flags & EVENT_FL_FAILED) { +out_failed: + trace_seq_printf(s, "[FAILED TO PARSE]"); + } + + if (args) { + free_args(args); + free(bprint_fmt); + } +} + +/** + * pevent_data_lat_fmt - parse the data for the latency format + * @pevent: a handle to the pevent + * @s: the trace_seq to write to + * @record: the record to read from + * + * This parses out the Latency format (interrupts disabled, + * need rescheduling, in hard/soft interrupt, preempt count + * and lock depth) and places it into the trace_seq. + */ +void pevent_data_lat_fmt(struct pevent *pevent, + struct trace_seq *s, struct pevent_record *record) +{ + static int check_lock_depth = 1; + static int check_migrate_disable = 1; + static int lock_depth_exists; + static int migrate_disable_exists; + unsigned int lat_flags; + unsigned int pc; + int lock_depth; + int migrate_disable; + int hardirq; + int softirq; + void *data = record->data; + + lat_flags = parse_common_flags(pevent, data); + pc = parse_common_pc(pevent, data); + /* lock_depth may not always exist */ + if (lock_depth_exists) + lock_depth = parse_common_lock_depth(pevent, data); + else if (check_lock_depth) { + lock_depth = parse_common_lock_depth(pevent, data); + if (lock_depth < 0) + check_lock_depth = 0; + else + lock_depth_exists = 1; + } + + /* migrate_disable may not always exist */ + if (migrate_disable_exists) + migrate_disable = parse_common_migrate_disable(pevent, data); + else if (check_migrate_disable) { + migrate_disable = parse_common_migrate_disable(pevent, data); + if (migrate_disable < 0) + check_migrate_disable = 0; + else + migrate_disable_exists = 1; + } + + hardirq = lat_flags & TRACE_FLAG_HARDIRQ; + softirq = lat_flags & TRACE_FLAG_SOFTIRQ; + + trace_seq_printf(s, "%c%c%c", + (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' : + (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ? + 'X' : '.', + (lat_flags & TRACE_FLAG_NEED_RESCHED) ? + 'N' : '.', + (hardirq && softirq) ? 'H' : + hardirq ? 'h' : softirq ? 's' : '.'); + + if (pc) + trace_seq_printf(s, "%x", pc); + else + trace_seq_putc(s, '.'); + + if (migrate_disable_exists) { + if (migrate_disable < 0) + trace_seq_putc(s, '.'); + else + trace_seq_printf(s, "%d", migrate_disable); + } + + if (lock_depth_exists) { + if (lock_depth < 0) + trace_seq_putc(s, '.'); + else + trace_seq_printf(s, "%d", lock_depth); + } + + trace_seq_terminate(s); +} + +/** + * pevent_data_type - parse out the given event type + * @pevent: a handle to the pevent + * @rec: the record to read from + * + * This returns the event id from the @rec. + */ +int pevent_data_type(struct pevent *pevent, struct pevent_record *rec) +{ + return trace_parse_common_type(pevent, rec->data); +} + +/** + * pevent_data_event_from_type - find the event by a given type + * @pevent: a handle to the pevent + * @type: the type of the event. + * + * This returns the event form a given @type; + */ +struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type) +{ + return pevent_find_event(pevent, type); +} + +/** + * pevent_data_pid - parse the PID from raw data + * @pevent: a handle to the pevent + * @rec: the record to parse + * + * This returns the PID from a raw data. + */ +int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec) +{ + return parse_common_pid(pevent, rec->data); +} + +/** + * pevent_data_comm_from_pid - return the command line from PID + * @pevent: a handle to the pevent + * @pid: the PID of the task to search for + * + * This returns a pointer to the command line that has the given + * @pid. + */ +const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid) +{ + const char *comm; + + comm = find_cmdline(pevent, pid); + return comm; +} + +/** + * pevent_data_comm_from_pid - parse the data into the print format + * @s: the trace_seq to write to + * @event: the handle to the event + * @record: the record to read from + * + * This parses the raw @data using the given @event information and + * writes the print format into the trace_seq. + */ +void pevent_event_info(struct trace_seq *s, struct event_format *event, + struct pevent_record *record) +{ + int print_pretty = 1; + + if (event->pevent->print_raw) + print_event_fields(s, record->data, record->size, event); + else { + + if (event->handler) + print_pretty = event->handler(s, record, event, + event->context); + + if (print_pretty) + pretty_print(s, record->data, record->size, event); + } + + trace_seq_terminate(s); +} + +void pevent_print_event(struct pevent *pevent, struct trace_seq *s, + struct pevent_record *record) +{ + static const char *spaces = " "; /* 20 spaces */ + struct event_format *event; + unsigned long secs; + unsigned long usecs; + unsigned long nsecs; + const char *comm; + void *data = record->data; + int type; + int pid; + int len; + int p; + + secs = record->ts / NSECS_PER_SEC; + nsecs = record->ts - secs * NSECS_PER_SEC; + + if (record->size < 0) { + do_warning("ug! negative record size %d", record->size); + return; + } + + type = trace_parse_common_type(pevent, data); + + event = pevent_find_event(pevent, type); + if (!event) { + do_warning("ug! no event found for type %d", type); + return; + } + + pid = parse_common_pid(pevent, data); + comm = find_cmdline(pevent, pid); + + if (pevent->latency_format) { + trace_seq_printf(s, "%8.8s-%-5d %3d", + comm, pid, record->cpu); + pevent_data_lat_fmt(pevent, s, record); + } else + trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu); + + if (pevent->flags & PEVENT_NSEC_OUTPUT) { + usecs = nsecs; + p = 9; + } else { + usecs = (nsecs + 500) / NSECS_PER_USEC; + p = 6; + } + + trace_seq_printf(s, " %5lu.%0*lu: %s: ", secs, p, usecs, event->name); + + /* Space out the event names evenly. */ + len = strlen(event->name); + if (len < 20) + trace_seq_printf(s, "%.*s", 20 - len, spaces); + + pevent_event_info(s, event, record); +} + +static int events_id_cmp(const void *a, const void *b) +{ + struct event_format * const * ea = a; + struct event_format * const * eb = b; + + if ((*ea)->id < (*eb)->id) + return -1; + + if ((*ea)->id > (*eb)->id) + return 1; + + return 0; +} + +static int events_name_cmp(const void *a, const void *b) +{ + struct event_format * const * ea = a; + struct event_format * const * eb = b; + int res; + + res = strcmp((*ea)->name, (*eb)->name); + if (res) + return res; + + res = strcmp((*ea)->system, (*eb)->system); + if (res) + return res; + + return events_id_cmp(a, b); +} + +static int events_system_cmp(const void *a, const void *b) +{ + struct event_format * const * ea = a; + struct event_format * const * eb = b; + int res; + + res = strcmp((*ea)->system, (*eb)->system); + if (res) + return res; + + res = strcmp((*ea)->name, (*eb)->name); + if (res) + return res; + + return events_id_cmp(a, b); +} + +struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type sort_type) +{ + struct event_format **events; + int (*sort)(const void *a, const void *b); + + events = pevent->sort_events; + + if (events && pevent->last_type == sort_type) + return events; + + if (!events) { + events = malloc(sizeof(*events) * (pevent->nr_events + 1)); + if (!events) + return NULL; + + memcpy(events, pevent->events, sizeof(*events) * pevent->nr_events); + events[pevent->nr_events] = NULL; + + pevent->sort_events = events; + + /* the internal events are sorted by id */ + if (sort_type == EVENT_SORT_ID) { + pevent->last_type = sort_type; + return events; + } + } + + switch (sort_type) { + case EVENT_SORT_ID: + sort = events_id_cmp; + break; + case EVENT_SORT_NAME: + sort = events_name_cmp; + break; + case EVENT_SORT_SYSTEM: + sort = events_system_cmp; + break; + default: + return events; + } + + qsort(events, pevent->nr_events, sizeof(*events), sort); + pevent->last_type = sort_type; + + return events; +} + +static struct format_field ** +get_event_fields(const char *type, const char *name, + int count, struct format_field *list) +{ + struct format_field **fields; + struct format_field *field; + int i = 0; + + fields = malloc(sizeof(*fields) * (count + 1)); + if (!fields) + return NULL; + + for (field = list; field; field = field->next) { + fields[i++] = field; + if (i == count + 1) { + do_warning("event %s has more %s fields than specified", + name, type); + i--; + break; + } + } + + if (i != count) + do_warning("event %s has less %s fields than specified", + name, type); + + fields[i] = NULL; + + return fields; +} + +/** + * pevent_event_common_fields - return a list of common fields for an event + * @event: the event to return the common fields of. + * + * Returns an allocated array of fields. The last item in the array is NULL. + * The array must be freed with free(). + */ +struct format_field **pevent_event_common_fields(struct event_format *event) +{ + return get_event_fields("common", event->name, + event->format.nr_common, + event->format.common_fields); +} + +/** + * pevent_event_fields - return a list of event specific fields for an event + * @event: the event to return the fields of. + * + * Returns an allocated array of fields. The last item in the array is NULL. + * The array must be freed with free(). + */ +struct format_field **pevent_event_fields(struct event_format *event) +{ + return get_event_fields("event", event->name, + event->format.nr_fields, + event->format.fields); +} + +static void print_fields(struct trace_seq *s, struct print_flag_sym *field) +{ + trace_seq_printf(s, "{ %s, %s }", field->value, field->str); + if (field->next) { + trace_seq_puts(s, ", "); + print_fields(s, field->next); + } +} + +/* for debugging */ +static void print_args(struct print_arg *args) +{ + int print_paren = 1; + struct trace_seq s; + + switch (args->type) { + case PRINT_NULL: + printf("null"); + break; + case PRINT_ATOM: + printf("%s", args->atom.atom); + break; + case PRINT_FIELD: + printf("REC->%s", args->field.name); + break; + case PRINT_FLAGS: + printf("__print_flags("); + print_args(args->flags.field); + printf(", %s, ", args->flags.delim); + trace_seq_init(&s); + print_fields(&s, args->flags.flags); + trace_seq_do_printf(&s); + trace_seq_destroy(&s); + printf(")"); + break; + case PRINT_SYMBOL: + printf("__print_symbolic("); + print_args(args->symbol.field); + printf(", "); + trace_seq_init(&s); + print_fields(&s, args->symbol.symbols); + trace_seq_do_printf(&s); + trace_seq_destroy(&s); + printf(")"); + break; + case PRINT_HEX: + printf("__print_hex("); + print_args(args->hex.field); + printf(", "); + print_args(args->hex.size); + printf(")"); + break; + case PRINT_STRING: + case PRINT_BSTRING: + printf("__get_str(%s)", args->string.string); + break; + case PRINT_TYPE: + printf("(%s)", args->typecast.type); + print_args(args->typecast.item); + break; + case PRINT_OP: + if (strcmp(args->op.op, ":") == 0) + print_paren = 0; + if (print_paren) + printf("("); + print_args(args->op.left); + printf(" %s ", args->op.op); + print_args(args->op.right); + if (print_paren) + printf(")"); + break; + default: + /* we should warn... */ + return; + } + if (args->next) { + printf("\n"); + print_args(args->next); + } +} + +static void parse_header_field(const char *field, + int *offset, int *size, int mandatory) +{ + unsigned long long save_input_buf_ptr; + unsigned long long save_input_buf_siz; + char *token; + int type; + + save_input_buf_ptr = input_buf_ptr; + save_input_buf_siz = input_buf_siz; + + if (read_expected(EVENT_ITEM, "field") < 0) + return; + if (read_expected(EVENT_OP, ":") < 0) + return; + + /* type */ + if (read_expect_type(EVENT_ITEM, &token) < 0) + goto fail; + free_token(token); + + /* + * If this is not a mandatory field, then test it first. + */ + if (mandatory) { + if (read_expected(EVENT_ITEM, field) < 0) + return; + } else { + if (read_expect_type(EVENT_ITEM, &token) < 0) + goto fail; + if (strcmp(token, field) != 0) + goto discard; + free_token(token); + } + + if (read_expected(EVENT_OP, ";") < 0) + return; + if (read_expected(EVENT_ITEM, "offset") < 0) + return; + if (read_expected(EVENT_OP, ":") < 0) + return; + if (read_expect_type(EVENT_ITEM, &token) < 0) + goto fail; + *offset = atoi(token); + free_token(token); + if (read_expected(EVENT_OP, ";") < 0) + return; + if (read_expected(EVENT_ITEM, "size") < 0) + return; + if (read_expected(EVENT_OP, ":") < 0) + return; + if (read_expect_type(EVENT_ITEM, &token) < 0) + goto fail; + *size = atoi(token); + free_token(token); + if (read_expected(EVENT_OP, ";") < 0) + return; + type = read_token(&token); + if (type != EVENT_NEWLINE) { + /* newer versions of the kernel have a "signed" type */ + if (type != EVENT_ITEM) + goto fail; + + if (strcmp(token, "signed") != 0) + goto fail; + + free_token(token); + + if (read_expected(EVENT_OP, ":") < 0) + return; + + if (read_expect_type(EVENT_ITEM, &token)) + goto fail; + + free_token(token); + if (read_expected(EVENT_OP, ";") < 0) + return; + + if (read_expect_type(EVENT_NEWLINE, &token)) + goto fail; + } + fail: + free_token(token); + return; + + discard: + input_buf_ptr = save_input_buf_ptr; + input_buf_siz = save_input_buf_siz; + *offset = 0; + *size = 0; + free_token(token); +} + +/** + * pevent_parse_header_page - parse the data stored in the header page + * @pevent: the handle to the pevent + * @buf: the buffer storing the header page format string + * @size: the size of @buf + * @long_size: the long size to use if there is no header + * + * This parses the header page format for information on the + * ring buffer used. The @buf should be copied from + * + * /sys/kernel/debug/tracing/events/header_page + */ +int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size, + int long_size) +{ + int ignore; + + if (!size) { + /* + * Old kernels did not have header page info. + * Sorry but we just use what we find here in user space. + */ + pevent->header_page_ts_size = sizeof(long long); + pevent->header_page_size_size = long_size; + pevent->header_page_data_offset = sizeof(long long) + long_size; + pevent->old_format = 1; + return -1; + } + init_input_buf(buf, size); + + parse_header_field("timestamp", &pevent->header_page_ts_offset, + &pevent->header_page_ts_size, 1); + parse_header_field("commit", &pevent->header_page_size_offset, + &pevent->header_page_size_size, 1); + parse_header_field("overwrite", &pevent->header_page_overwrite, + &ignore, 0); + parse_header_field("data", &pevent->header_page_data_offset, + &pevent->header_page_data_size, 1); + + return 0; +} + +static int event_matches(struct event_format *event, + int id, const char *sys_name, + const char *event_name) +{ + if (id >= 0 && id != event->id) + return 0; + + if (event_name && (strcmp(event_name, event->name) != 0)) + return 0; + + if (sys_name && (strcmp(sys_name, event->system) != 0)) + return 0; + + return 1; +} + +static void free_handler(struct event_handler *handle) +{ + free((void *)handle->sys_name); + free((void *)handle->event_name); + free(handle); +} + +static int find_event_handle(struct pevent *pevent, struct event_format *event) +{ + struct event_handler *handle, **next; + + for (next = &pevent->handlers; *next; + next = &(*next)->next) { + handle = *next; + if (event_matches(event, handle->id, + handle->sys_name, + handle->event_name)) + break; + } + + if (!(*next)) + return 0; + + pr_stat("overriding event (%d) %s:%s with new print handler", + event->id, event->system, event->name); + + event->handler = handle->func; + event->context = handle->context; + + *next = handle->next; + free_handler(handle); + + return 1; +} + +/** + * __pevent_parse_format - parse the event format + * @buf: the buffer storing the event format string + * @size: the size of @buf + * @sys: the system the event belongs to + * + * This parses the event format and creates an event structure + * to quickly parse raw data for a given event. + * + * These files currently come from: + * + * /sys/kernel/debug/tracing/events/.../.../format + */ +enum pevent_errno __pevent_parse_format(struct event_format **eventp, + struct pevent *pevent, const char *buf, + unsigned long size, const char *sys) +{ + struct event_format *event; + int ret; + + init_input_buf(buf, size); + + *eventp = event = alloc_event(); + if (!event) + return PEVENT_ERRNO__MEM_ALLOC_FAILED; + + event->name = event_read_name(); + if (!event->name) { + /* Bad event? */ + ret = PEVENT_ERRNO__MEM_ALLOC_FAILED; + goto event_alloc_failed; + } + + if (strcmp(sys, "ftrace") == 0) { + event->flags |= EVENT_FL_ISFTRACE; + + if (strcmp(event->name, "bprint") == 0) + event->flags |= EVENT_FL_ISBPRINT; + } + + event->id = event_read_id(); + if (event->id < 0) { + ret = PEVENT_ERRNO__READ_ID_FAILED; + /* + * This isn't an allocation error actually. + * But as the ID is critical, just bail out. + */ + goto event_alloc_failed; + } + + event->system = strdup(sys); + if (!event->system) { + ret = PEVENT_ERRNO__MEM_ALLOC_FAILED; + goto event_alloc_failed; + } + + /* Add pevent to event so that it can be referenced */ + event->pevent = pevent; + + ret = event_read_format(event); + if (ret < 0) { + ret = PEVENT_ERRNO__READ_FORMAT_FAILED; + goto event_parse_failed; + } + + /* + * If the event has an override, don't print warnings if the event + * print format fails to parse. + */ + if (pevent && find_event_handle(pevent, event)) + show_warning = 0; + + ret = event_read_print(event); + show_warning = 1; + + if (ret < 0) { + ret = PEVENT_ERRNO__READ_PRINT_FAILED; + goto event_parse_failed; + } + + if (!ret && (event->flags & EVENT_FL_ISFTRACE)) { + struct format_field *field; + struct print_arg *arg, **list; + + /* old ftrace had no args */ + list = &event->print_fmt.args; + for (field = event->format.fields; field; field = field->next) { + arg = alloc_arg(); + if (!arg) { + event->flags |= EVENT_FL_FAILED; + return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED; + } + arg->type = PRINT_FIELD; + arg->field.name = strdup(field->name); + if (!arg->field.name) { + event->flags |= EVENT_FL_FAILED; + free_arg(arg); + return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED; + } + arg->field.field = field; + *list = arg; + list = &arg->next; + } + return 0; + } + + return 0; + + event_parse_failed: + event->flags |= EVENT_FL_FAILED; + return ret; + + event_alloc_failed: + free(event->system); + free(event->name); + free(event); + *eventp = NULL; + return ret; +} + +/** + * pevent_parse_format - parse the event format + * @buf: the buffer storing the event format string + * @size: the size of @buf + * @sys: the system the event belongs to + * + * This parses the event format and creates an event structure + * to quickly parse raw data for a given event. + * + * These files currently come from: + * + * /sys/kernel/debug/tracing/events/.../.../format + */ +enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf, + unsigned long size, const char *sys) +{ + return __pevent_parse_format(eventp, NULL, buf, size, sys); +} + +/** + * pevent_parse_event - parse the event format + * @pevent: the handle to the pevent + * @buf: the buffer storing the event format string + * @size: the size of @buf + * @sys: the system the event belongs to + * + * This parses the event format and creates an event structure + * to quickly parse raw data for a given event. + * + * These files currently come from: + * + * /sys/kernel/debug/tracing/events/.../.../format + */ +enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf, + unsigned long size, const char *sys) +{ + struct event_format *event = NULL; + int ret = __pevent_parse_format(&event, pevent, buf, size, sys); + + if (event == NULL) + return ret; + + if (add_event(pevent, event)) { + ret = PEVENT_ERRNO__MEM_ALLOC_FAILED; + goto event_add_failed; + } + +#define PRINT_ARGS 0 + if (PRINT_ARGS && event->print_fmt.args) + print_args(event->print_fmt.args); + + return 0; + +event_add_failed: + pevent_free_format(event); + return ret; +} + +#undef _PE +#define _PE(code, str) str +static const char * const pevent_error_str[] = { + PEVENT_ERRORS +}; +#undef _PE + +int pevent_strerror(struct pevent *pevent __maybe_unused, + enum pevent_errno errnum, char *buf, size_t buflen) +{ + int idx; + const char *msg; + + if (errnum >= 0) { + msg = strerror_r(errnum, buf, buflen); + if (msg != buf) { + size_t len = strlen(msg); + memcpy(buf, msg, min(buflen - 1, len)); + *(buf + min(buflen - 1, len)) = '\0'; + } + return 0; + } + + if (errnum <= __PEVENT_ERRNO__START || + errnum >= __PEVENT_ERRNO__END) + return -1; + + idx = errnum - __PEVENT_ERRNO__START - 1; + msg = pevent_error_str[idx]; + + switch (errnum) { + case PEVENT_ERRNO__MEM_ALLOC_FAILED: + case PEVENT_ERRNO__PARSE_EVENT_FAILED: + case PEVENT_ERRNO__READ_ID_FAILED: + case PEVENT_ERRNO__READ_FORMAT_FAILED: + case PEVENT_ERRNO__READ_PRINT_FAILED: + case PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED: + case PEVENT_ERRNO__INVALID_ARG_TYPE: + snprintf(buf, buflen, "%s", msg); + break; + + default: + /* cannot reach here */ + break; + } + + return 0; +} + +int get_field_val(struct trace_seq *s, struct format_field *field, + const char *name, struct pevent_record *record, + unsigned long long *val, int err) +{ + if (!field) { + if (err) + trace_seq_printf(s, "", name); + return -1; + } + + if (pevent_read_number_field(field, record->data, val)) { + if (err) + trace_seq_printf(s, " %s=INVALID", name); + return -1; + } + + return 0; +} + +/** + * pevent_get_field_raw - return the raw pointer into the data field + * @s: The seq to print to on error + * @event: the event that the field is for + * @name: The name of the field + * @record: The record with the field name. + * @len: place to store the field length. + * @err: print default error if failed. + * + * Returns a pointer into record->data of the field and places + * the length of the field in @len. + * + * On failure, it returns NULL. + */ +void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event, + const char *name, struct pevent_record *record, + int *len, int err) +{ + struct format_field *field; + void *data = record->data; + unsigned offset; + int dummy; + + if (!event) + return NULL; + + field = pevent_find_field(event, name); + + if (!field) { + if (err) + trace_seq_printf(s, "", name); + return NULL; + } + + /* Allow @len to be NULL */ + if (!len) + len = &dummy; + + offset = field->offset; + if (field->flags & FIELD_IS_DYNAMIC) { + offset = pevent_read_number(event->pevent, + data + offset, field->size); + *len = offset >> 16; + offset &= 0xffff; + } else + *len = field->size; + + return data + offset; +} + +/** + * pevent_get_field_val - find a field and return its value + * @s: The seq to print to on error + * @event: the event that the field is for + * @name: The name of the field + * @record: The record with the field name. + * @val: place to store the value of the field. + * @err: print default error if failed. + * + * Returns 0 on success -1 on field not found. + */ +int pevent_get_field_val(struct trace_seq *s, struct event_format *event, + const char *name, struct pevent_record *record, + unsigned long long *val, int err) +{ + struct format_field *field; + + if (!event) + return -1; + + field = pevent_find_field(event, name); + + return get_field_val(s, field, name, record, val, err); +} + +/** + * pevent_get_common_field_val - find a common field and return its value + * @s: The seq to print to on error + * @event: the event that the field is for + * @name: The name of the field + * @record: The record with the field name. + * @val: place to store the value of the field. + * @err: print default error if failed. + * + * Returns 0 on success -1 on field not found. + */ +int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event, + const char *name, struct pevent_record *record, + unsigned long long *val, int err) +{ + struct format_field *field; + + if (!event) + return -1; + + field = pevent_find_common_field(event, name); + + return get_field_val(s, field, name, record, val, err); +} + +/** + * pevent_get_any_field_val - find a any field and return its value + * @s: The seq to print to on error + * @event: the event that the field is for + * @name: The name of the field + * @record: The record with the field name. + * @val: place to store the value of the field. + * @err: print default error if failed. + * + * Returns 0 on success -1 on field not found. + */ +int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event, + const char *name, struct pevent_record *record, + unsigned long long *val, int err) +{ + struct format_field *field; + + if (!event) + return -1; + + field = pevent_find_any_field(event, name); + + return get_field_val(s, field, name, record, val, err); +} + +/** + * pevent_print_num_field - print a field and a format + * @s: The seq to print to + * @fmt: The printf format to print the field with. + * @event: the event that the field is for + * @name: The name of the field + * @record: The record with the field name. + * @err: print default error if failed. + * + * Returns: 0 on success, -1 field not found, or 1 if buffer is full. + */ +int pevent_print_num_field(struct trace_seq *s, const char *fmt, + struct event_format *event, const char *name, + struct pevent_record *record, int err) +{ + struct format_field *field = pevent_find_field(event, name); + unsigned long long val; + + if (!field) + goto failed; + + if (pevent_read_number_field(field, record->data, &val)) + goto failed; + + return trace_seq_printf(s, fmt, val); + + failed: + if (err) + trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name); + return -1; +} + +static void free_func_handle(struct pevent_function_handler *func) +{ + struct pevent_func_params *params; + + free(func->name); + + while (func->params) { + params = func->params; + func->params = params->next; + free(params); + } + + free(func); +} + +/** + * pevent_register_print_function - register a helper function + * @pevent: the handle to the pevent + * @func: the function to process the helper function + * @ret_type: the return type of the helper function + * @name: the name of the helper function + * @parameters: A list of enum pevent_func_arg_type + * + * Some events may have helper functions in the print format arguments. + * This allows a plugin to dynamically create a way to process one + * of these functions. + * + * The @parameters is a variable list of pevent_func_arg_type enums that + * must end with PEVENT_FUNC_ARG_VOID. + */ +int pevent_register_print_function(struct pevent *pevent, + pevent_func_handler func, + enum pevent_func_arg_type ret_type, + char *name, ...) +{ + struct pevent_function_handler *func_handle; + struct pevent_func_params **next_param; + struct pevent_func_params *param; + enum pevent_func_arg_type type; + va_list ap; + int ret; + + func_handle = find_func_handler(pevent, name); + if (func_handle) { + /* + * This is most like caused by the users own + * plugins updating the function. This overrides the + * system defaults. + */ + pr_stat("override of function helper '%s'", name); + remove_func_handler(pevent, name); + } + + func_handle = calloc(1, sizeof(*func_handle)); + if (!func_handle) { + do_warning("Failed to allocate function handler"); + return PEVENT_ERRNO__MEM_ALLOC_FAILED; + } + + func_handle->ret_type = ret_type; + func_handle->name = strdup(name); + func_handle->func = func; + if (!func_handle->name) { + do_warning("Failed to allocate function name"); + free(func_handle); + return PEVENT_ERRNO__MEM_ALLOC_FAILED; + } + + next_param = &(func_handle->params); + va_start(ap, name); + for (;;) { + type = va_arg(ap, enum pevent_func_arg_type); + if (type == PEVENT_FUNC_ARG_VOID) + break; + + if (type >= PEVENT_FUNC_ARG_MAX_TYPES) { + do_warning("Invalid argument type %d", type); + ret = PEVENT_ERRNO__INVALID_ARG_TYPE; + goto out_free; + } + + param = malloc(sizeof(*param)); + if (!param) { + do_warning("Failed to allocate function param"); + ret = PEVENT_ERRNO__MEM_ALLOC_FAILED; + goto out_free; + } + param->type = type; + param->next = NULL; + + *next_param = param; + next_param = &(param->next); + + func_handle->nr_args++; + } + va_end(ap); + + func_handle->next = pevent->func_handlers; + pevent->func_handlers = func_handle; + + return 0; + out_free: + va_end(ap); + free_func_handle(func_handle); + return ret; +} + +/** + * pevent_register_event_handler - register a way to parse an event + * @pevent: the handle to the pevent + * @id: the id of the event to register + * @sys_name: the system name the event belongs to + * @event_name: the name of the event + * @func: the function to call to parse the event information + * @context: the data to be passed to @func + * + * This function allows a developer to override the parsing of + * a given event. If for some reason the default print format + * is not sufficient, this function will register a function + * for an event to be used to parse the data instead. + * + * If @id is >= 0, then it is used to find the event. + * else @sys_name and @event_name are used. + */ +int pevent_register_event_handler(struct pevent *pevent, + int id, char *sys_name, char *event_name, + pevent_event_handler_func func, + void *context) +{ + struct event_format *event; + struct event_handler *handle; + + if (id >= 0) { + /* search by id */ + event = pevent_find_event(pevent, id); + if (!event) + goto not_found; + if (event_name && (strcmp(event_name, event->name) != 0)) + goto not_found; + if (sys_name && (strcmp(sys_name, event->system) != 0)) + goto not_found; + } else { + event = pevent_find_event_by_name(pevent, sys_name, event_name); + if (!event) + goto not_found; + } + + pr_stat("overriding event (%d) %s:%s with new print handler", + event->id, event->system, event->name); + + event->handler = func; + event->context = context; + return 0; + + not_found: + /* Save for later use. */ + handle = calloc(1, sizeof(*handle)); + if (!handle) { + do_warning("Failed to allocate event handler"); + return PEVENT_ERRNO__MEM_ALLOC_FAILED; + } + + handle->id = id; + if (event_name) + handle->event_name = strdup(event_name); + if (sys_name) + handle->sys_name = strdup(sys_name); + + if ((event_name && !handle->event_name) || + (sys_name && !handle->sys_name)) { + do_warning("Failed to allocate event/sys name"); + free((void *)handle->event_name); + free((void *)handle->sys_name); + free(handle); + return PEVENT_ERRNO__MEM_ALLOC_FAILED; + } + + handle->func = func; + handle->next = pevent->handlers; + pevent->handlers = handle; + handle->context = context; + + return -1; +} + +/** + * pevent_alloc - create a pevent handle + */ +struct pevent *pevent_alloc(void) +{ + struct pevent *pevent = calloc(1, sizeof(*pevent)); + + if (pevent) + pevent->ref_count = 1; + + return pevent; +} + +void pevent_ref(struct pevent *pevent) +{ + pevent->ref_count++; +} + +static void free_format_fields(struct format_field *field) +{ + struct format_field *next; + + while (field) { + next = field->next; + free(field->type); + free(field->name); + free(field); + field = next; + } +} + +static void free_formats(struct format *format) +{ + free_format_fields(format->common_fields); + free_format_fields(format->fields); +} + +void pevent_free_format(struct event_format *event) +{ + free(event->name); + free(event->system); + + free_formats(&event->format); + + free(event->print_fmt.format); + free_args(event->print_fmt.args); + + free(event); +} + +/** + * pevent_free - free a pevent handle + * @pevent: the pevent handle to free + */ +void pevent_free(struct pevent *pevent) +{ + struct cmdline_list *cmdlist, *cmdnext; + struct func_list *funclist, *funcnext; + struct printk_list *printklist, *printknext; + struct pevent_function_handler *func_handler; + struct event_handler *handle; + int i; + + if (!pevent) + return; + + cmdlist = pevent->cmdlist; + funclist = pevent->funclist; + printklist = pevent->printklist; + + pevent->ref_count--; + if (pevent->ref_count) + return; + + if (pevent->cmdlines) { + for (i = 0; i < pevent->cmdline_count; i++) + free(pevent->cmdlines[i].comm); + free(pevent->cmdlines); + } + + while (cmdlist) { + cmdnext = cmdlist->next; + free(cmdlist->comm); + free(cmdlist); + cmdlist = cmdnext; + } + + if (pevent->func_map) { + for (i = 0; i < (int)pevent->func_count; i++) { + free(pevent->func_map[i].func); + free(pevent->func_map[i].mod); + } + free(pevent->func_map); + } + + while (funclist) { + funcnext = funclist->next; + free(funclist->func); + free(funclist->mod); + free(funclist); + funclist = funcnext; + } + + while (pevent->func_handlers) { + func_handler = pevent->func_handlers; + pevent->func_handlers = func_handler->next; + free_func_handle(func_handler); + } + + if (pevent->printk_map) { + for (i = 0; i < (int)pevent->printk_count; i++) + free(pevent->printk_map[i].printk); + free(pevent->printk_map); + } + + while (printklist) { + printknext = printklist->next; + free(printklist->printk); + free(printklist); + printklist = printknext; + } + + for (i = 0; i < pevent->nr_events; i++) + pevent_free_format(pevent->events[i]); + + while (pevent->handlers) { + handle = pevent->handlers; + pevent->handlers = handle->next; + free_handler(handle); + } + + free(pevent->events); + free(pevent->sort_events); + + free(pevent); +} + +void pevent_unref(struct pevent *pevent) +{ + pevent_free(pevent); +} diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h new file mode 100644 index 00000000..7be7e895 --- /dev/null +++ b/tools/lib/traceevent/event-parse.h @@ -0,0 +1,844 @@ +/* + * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#ifndef _PARSE_EVENTS_H +#define _PARSE_EVENTS_H + +#include +#include + +#ifndef __maybe_unused +#define __maybe_unused __attribute__((unused)) +#endif + +/* ----------------------- trace_seq ----------------------- */ + + +#ifndef TRACE_SEQ_BUF_SIZE +#define TRACE_SEQ_BUF_SIZE 4096 +#endif + +#ifndef DEBUG_RECORD +#define DEBUG_RECORD 0 +#endif + +struct pevent_record { + unsigned long long ts; + unsigned long long offset; + long long missed_events; /* buffer dropped events before */ + int record_size; /* size of binary record */ + int size; /* size of data */ + void *data; + int cpu; + int ref_count; + int locked; /* Do not free, even if ref_count is zero */ + void *priv; +#if DEBUG_RECORD + struct pevent_record *prev; + struct pevent_record *next; + long alloc_addr; +#endif +}; + +/* + * Trace sequences are used to allow a function to call several other functions + * to create a string of data to use (up to a max of PAGE_SIZE). + */ + +struct trace_seq { + char *buffer; + unsigned int buffer_size; + unsigned int len; + unsigned int readpos; +}; + +void trace_seq_init(struct trace_seq *s); +void trace_seq_destroy(struct trace_seq *s); + +extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +extern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args) + __attribute__ ((format (printf, 2, 0))); + +extern int trace_seq_puts(struct trace_seq *s, const char *str); +extern int trace_seq_putc(struct trace_seq *s, unsigned char c); + +extern void trace_seq_terminate(struct trace_seq *s); + +extern int trace_seq_do_printf(struct trace_seq *s); + + +/* ----------------------- pevent ----------------------- */ + +struct pevent; +struct event_format; + +typedef int (*pevent_event_handler_func)(struct trace_seq *s, + struct pevent_record *record, + struct event_format *event, + void *context); + +typedef int (*pevent_plugin_load_func)(struct pevent *pevent); +typedef int (*pevent_plugin_unload_func)(void); + +struct plugin_option { + struct plugin_option *next; + void *handle; + char *file; + char *name; + char *plugin_alias; + char *description; + char *value; + void *priv; + int set; +}; + +/* + * Plugin hooks that can be called: + * + * PEVENT_PLUGIN_LOADER: (required) + * The function name to initialized the plugin. + * + * int PEVENT_PLUGIN_LOADER(struct pevent *pevent) + * + * PEVENT_PLUGIN_UNLOADER: (optional) + * The function called just before unloading + * + * int PEVENT_PLUGIN_UNLOADER(void) + * + * PEVENT_PLUGIN_OPTIONS: (optional) + * Plugin options that can be set before loading + * + * struct plugin_option PEVENT_PLUGIN_OPTIONS[] = { + * { + * .name = "option-name", + * .plugin_alias = "overide-file-name", (optional) + * .description = "description of option to show users", + * }, + * { + * .name = NULL, + * }, + * }; + * + * Array must end with .name = NULL; + * + * + * .plugin_alias is used to give a shorter name to access + * the vairable. Useful if a plugin handles more than one event. + * + * PEVENT_PLUGIN_ALIAS: (optional) + * The name to use for finding options (uses filename if not defined) + */ +#define PEVENT_PLUGIN_LOADER pevent_plugin_loader +#define PEVENT_PLUGIN_UNLOADER pevent_plugin_unloader +#define PEVENT_PLUGIN_OPTIONS pevent_plugin_options +#define PEVENT_PLUGIN_ALIAS pevent_plugin_alias +#define _MAKE_STR(x) #x +#define MAKE_STR(x) _MAKE_STR(x) +#define PEVENT_PLUGIN_LOADER_NAME MAKE_STR(PEVENT_PLUGIN_LOADER) +#define PEVENT_PLUGIN_UNLOADER_NAME MAKE_STR(PEVENT_PLUGIN_UNLOADER) +#define PEVENT_PLUGIN_OPTIONS_NAME MAKE_STR(PEVENT_PLUGIN_OPTIONS) +#define PEVENT_PLUGIN_ALIAS_NAME MAKE_STR(PEVENT_PLUGIN_ALIAS) + +#define NSECS_PER_SEC 1000000000ULL +#define NSECS_PER_USEC 1000ULL + +enum format_flags { + FIELD_IS_ARRAY = 1, + FIELD_IS_POINTER = 2, + FIELD_IS_SIGNED = 4, + FIELD_IS_STRING = 8, + FIELD_IS_DYNAMIC = 16, + FIELD_IS_LONG = 32, + FIELD_IS_FLAG = 64, + FIELD_IS_SYMBOLIC = 128, +}; + +struct format_field { + struct format_field *next; + struct event_format *event; + char *type; + char *name; + int offset; + int size; + unsigned int arraylen; + unsigned int elementsize; + unsigned long flags; +}; + +struct format { + int nr_common; + int nr_fields; + struct format_field *common_fields; + struct format_field *fields; +}; + +struct print_arg_atom { + char *atom; +}; + +struct print_arg_string { + char *string; + int offset; +}; + +struct print_arg_field { + char *name; + struct format_field *field; +}; + +struct print_flag_sym { + struct print_flag_sym *next; + char *value; + char *str; +}; + +struct print_arg_typecast { + char *type; + struct print_arg *item; +}; + +struct print_arg_flags { + struct print_arg *field; + char *delim; + struct print_flag_sym *flags; +}; + +struct print_arg_symbol { + struct print_arg *field; + struct print_flag_sym *symbols; +}; + +struct print_arg_hex { + struct print_arg *field; + struct print_arg *size; +}; + +struct print_arg_dynarray { + struct format_field *field; + struct print_arg *index; +}; + +struct print_arg; + +struct print_arg_op { + char *op; + int prio; + struct print_arg *left; + struct print_arg *right; +}; + +struct pevent_function_handler; + +struct print_arg_func { + struct pevent_function_handler *func; + struct print_arg *args; +}; + +enum print_arg_type { + PRINT_NULL, + PRINT_ATOM, + PRINT_FIELD, + PRINT_FLAGS, + PRINT_SYMBOL, + PRINT_HEX, + PRINT_TYPE, + PRINT_STRING, + PRINT_BSTRING, + PRINT_DYNAMIC_ARRAY, + PRINT_OP, + PRINT_FUNC, +}; + +struct print_arg { + struct print_arg *next; + enum print_arg_type type; + union { + struct print_arg_atom atom; + struct print_arg_field field; + struct print_arg_typecast typecast; + struct print_arg_flags flags; + struct print_arg_symbol symbol; + struct print_arg_hex hex; + struct print_arg_func func; + struct print_arg_string string; + struct print_arg_op op; + struct print_arg_dynarray dynarray; + }; +}; + +struct print_fmt { + char *format; + struct print_arg *args; +}; + +struct event_format { + struct pevent *pevent; + char *name; + int id; + int flags; + struct format format; + struct print_fmt print_fmt; + char *system; + pevent_event_handler_func handler; + void *context; +}; + +enum { + EVENT_FL_ISFTRACE = 0x01, + EVENT_FL_ISPRINT = 0x02, + EVENT_FL_ISBPRINT = 0x04, + EVENT_FL_ISFUNCENT = 0x10, + EVENT_FL_ISFUNCRET = 0x20, + + EVENT_FL_FAILED = 0x80000000 +}; + +enum event_sort_type { + EVENT_SORT_ID, + EVENT_SORT_NAME, + EVENT_SORT_SYSTEM, +}; + +enum event_type { + EVENT_ERROR, + EVENT_NONE, + EVENT_SPACE, + EVENT_NEWLINE, + EVENT_OP, + EVENT_DELIM, + EVENT_ITEM, + EVENT_DQUOTE, + EVENT_SQUOTE, +}; + +typedef unsigned long long (*pevent_func_handler)(struct trace_seq *s, + unsigned long long *args); + +enum pevent_func_arg_type { + PEVENT_FUNC_ARG_VOID, + PEVENT_FUNC_ARG_INT, + PEVENT_FUNC_ARG_LONG, + PEVENT_FUNC_ARG_STRING, + PEVENT_FUNC_ARG_PTR, + PEVENT_FUNC_ARG_MAX_TYPES +}; + +enum pevent_flag { + PEVENT_NSEC_OUTPUT = 1, /* output in NSECS */ +}; + +#define PEVENT_ERRORS \ + _PE(MEM_ALLOC_FAILED, "failed to allocate memory"), \ + _PE(PARSE_EVENT_FAILED, "failed to parse event"), \ + _PE(READ_ID_FAILED, "failed to read event id"), \ + _PE(READ_FORMAT_FAILED, "failed to read event format"), \ + _PE(READ_PRINT_FAILED, "failed to read event print fmt"), \ + _PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\ + _PE(INVALID_ARG_TYPE, "invalid argument type") + +#undef _PE +#define _PE(__code, __str) PEVENT_ERRNO__ ## __code +enum pevent_errno { + PEVENT_ERRNO__SUCCESS = 0, + + /* + * Choose an arbitrary negative big number not to clash with standard + * errno since SUS requires the errno has distinct positive values. + * See 'Issue 6' in the link below. + * + * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html + */ + __PEVENT_ERRNO__START = -100000, + + PEVENT_ERRORS, + + __PEVENT_ERRNO__END, +}; +#undef _PE + +struct cmdline; +struct cmdline_list; +struct func_map; +struct func_list; +struct event_handler; + +struct pevent { + int ref_count; + + int header_page_ts_offset; + int header_page_ts_size; + int header_page_size_offset; + int header_page_size_size; + int header_page_data_offset; + int header_page_data_size; + int header_page_overwrite; + + int file_bigendian; + int host_bigendian; + + int latency_format; + + int old_format; + + int cpus; + int long_size; + + struct cmdline *cmdlines; + struct cmdline_list *cmdlist; + int cmdline_count; + + struct func_map *func_map; + struct func_list *funclist; + unsigned int func_count; + + struct printk_map *printk_map; + struct printk_list *printklist; + unsigned int printk_count; + + + struct event_format **events; + int nr_events; + struct event_format **sort_events; + enum event_sort_type last_type; + + int type_offset; + int type_size; + + int pid_offset; + int pid_size; + + int pc_offset; + int pc_size; + + int flags_offset; + int flags_size; + + int ld_offset; + int ld_size; + + int print_raw; + + int test_filters; + + int flags; + + struct format_field *bprint_ip_field; + struct format_field *bprint_fmt_field; + struct format_field *bprint_buf_field; + + struct event_handler *handlers; + struct pevent_function_handler *func_handlers; + + /* cache */ + struct event_format *last_event; +}; + +static inline void pevent_set_flag(struct pevent *pevent, int flag) +{ + pevent->flags |= flag; +} + +static inline unsigned short +__data2host2(struct pevent *pevent, unsigned short data) +{ + unsigned short swap; + + if (pevent->host_bigendian == pevent->file_bigendian) + return data; + + swap = ((data & 0xffULL) << 8) | + ((data & (0xffULL << 8)) >> 8); + + return swap; +} + +static inline unsigned int +__data2host4(struct pevent *pevent, unsigned int data) +{ + unsigned int swap; + + if (pevent->host_bigendian == pevent->file_bigendian) + return data; + + swap = ((data & 0xffULL) << 24) | + ((data & (0xffULL << 8)) << 8) | + ((data & (0xffULL << 16)) >> 8) | + ((data & (0xffULL << 24)) >> 24); + + return swap; +} + +static inline unsigned long long +__data2host8(struct pevent *pevent, unsigned long long data) +{ + unsigned long long swap; + + if (pevent->host_bigendian == pevent->file_bigendian) + return data; + + swap = ((data & 0xffULL) << 56) | + ((data & (0xffULL << 8)) << 40) | + ((data & (0xffULL << 16)) << 24) | + ((data & (0xffULL << 24)) << 8) | + ((data & (0xffULL << 32)) >> 8) | + ((data & (0xffULL << 40)) >> 24) | + ((data & (0xffULL << 48)) >> 40) | + ((data & (0xffULL << 56)) >> 56); + + return swap; +} + +#define data2host2(pevent, ptr) __data2host2(pevent, *(unsigned short *)(ptr)) +#define data2host4(pevent, ptr) __data2host4(pevent, *(unsigned int *)(ptr)) +#define data2host8(pevent, ptr) \ +({ \ + unsigned long long __val; \ + \ + memcpy(&__val, (ptr), sizeof(unsigned long long)); \ + __data2host8(pevent, __val); \ +}) + +/* taken from kernel/trace/trace.h */ +enum trace_flag_type { + TRACE_FLAG_IRQS_OFF = 0x01, + TRACE_FLAG_IRQS_NOSUPPORT = 0x02, + TRACE_FLAG_NEED_RESCHED = 0x04, + TRACE_FLAG_HARDIRQ = 0x08, + TRACE_FLAG_SOFTIRQ = 0x10, +}; + +int pevent_register_comm(struct pevent *pevent, const char *comm, int pid); +int pevent_register_function(struct pevent *pevent, char *name, + unsigned long long addr, char *mod); +int pevent_register_print_string(struct pevent *pevent, char *fmt, + unsigned long long addr); +int pevent_pid_is_registered(struct pevent *pevent, int pid); + +void pevent_print_event(struct pevent *pevent, struct trace_seq *s, + struct pevent_record *record); + +int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size, + int long_size); + +enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf, + unsigned long size, const char *sys); +enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf, + unsigned long size, const char *sys); +void pevent_free_format(struct event_format *event); + +void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event, + const char *name, struct pevent_record *record, + int *len, int err); + +int pevent_get_field_val(struct trace_seq *s, struct event_format *event, + const char *name, struct pevent_record *record, + unsigned long long *val, int err); +int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event, + const char *name, struct pevent_record *record, + unsigned long long *val, int err); +int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event, + const char *name, struct pevent_record *record, + unsigned long long *val, int err); + +int pevent_print_num_field(struct trace_seq *s, const char *fmt, + struct event_format *event, const char *name, + struct pevent_record *record, int err); + +int pevent_register_event_handler(struct pevent *pevent, int id, char *sys_name, char *event_name, + pevent_event_handler_func func, void *context); +int pevent_register_print_function(struct pevent *pevent, + pevent_func_handler func, + enum pevent_func_arg_type ret_type, + char *name, ...); + +struct format_field *pevent_find_common_field(struct event_format *event, const char *name); +struct format_field *pevent_find_field(struct event_format *event, const char *name); +struct format_field *pevent_find_any_field(struct event_format *event, const char *name); + +const char *pevent_find_function(struct pevent *pevent, unsigned long long addr); +unsigned long long +pevent_find_function_address(struct pevent *pevent, unsigned long long addr); +unsigned long long pevent_read_number(struct pevent *pevent, const void *ptr, int size); +int pevent_read_number_field(struct format_field *field, const void *data, + unsigned long long *value); + +struct event_format *pevent_find_event(struct pevent *pevent, int id); + +struct event_format * +pevent_find_event_by_name(struct pevent *pevent, const char *sys, const char *name); + +void pevent_data_lat_fmt(struct pevent *pevent, + struct trace_seq *s, struct pevent_record *record); +int pevent_data_type(struct pevent *pevent, struct pevent_record *rec); +struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type); +int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec); +const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid); +void pevent_event_info(struct trace_seq *s, struct event_format *event, + struct pevent_record *record); +int pevent_strerror(struct pevent *pevent, enum pevent_errno errnum, + char *buf, size_t buflen); + +struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type); +struct format_field **pevent_event_common_fields(struct event_format *event); +struct format_field **pevent_event_fields(struct event_format *event); + +static inline int pevent_get_cpus(struct pevent *pevent) +{ + return pevent->cpus; +} + +static inline void pevent_set_cpus(struct pevent *pevent, int cpus) +{ + pevent->cpus = cpus; +} + +static inline int pevent_get_long_size(struct pevent *pevent) +{ + return pevent->long_size; +} + +static inline void pevent_set_long_size(struct pevent *pevent, int long_size) +{ + pevent->long_size = long_size; +} + +static inline int pevent_is_file_bigendian(struct pevent *pevent) +{ + return pevent->file_bigendian; +} + +static inline void pevent_set_file_bigendian(struct pevent *pevent, int endian) +{ + pevent->file_bigendian = endian; +} + +static inline int pevent_is_host_bigendian(struct pevent *pevent) +{ + return pevent->host_bigendian; +} + +static inline void pevent_set_host_bigendian(struct pevent *pevent, int endian) +{ + pevent->host_bigendian = endian; +} + +static inline int pevent_is_latency_format(struct pevent *pevent) +{ + return pevent->latency_format; +} + +static inline void pevent_set_latency_format(struct pevent *pevent, int lat) +{ + pevent->latency_format = lat; +} + +struct pevent *pevent_alloc(void); +void pevent_free(struct pevent *pevent); +void pevent_ref(struct pevent *pevent); +void pevent_unref(struct pevent *pevent); + +/* access to the internal parser */ +void pevent_buffer_init(const char *buf, unsigned long long size); +enum event_type pevent_read_token(char **tok); +void pevent_free_token(char *token); +int pevent_peek_char(void); +const char *pevent_get_input_buf(void); +unsigned long long pevent_get_input_buf_ptr(void); + +/* for debugging */ +void pevent_print_funcs(struct pevent *pevent); +void pevent_print_printk(struct pevent *pevent); + +/* ----------------------- filtering ----------------------- */ + +enum filter_boolean_type { + FILTER_FALSE, + FILTER_TRUE, +}; + +enum filter_op_type { + FILTER_OP_AND = 1, + FILTER_OP_OR, + FILTER_OP_NOT, +}; + +enum filter_cmp_type { + FILTER_CMP_NONE, + FILTER_CMP_EQ, + FILTER_CMP_NE, + FILTER_CMP_GT, + FILTER_CMP_LT, + FILTER_CMP_GE, + FILTER_CMP_LE, + FILTER_CMP_MATCH, + FILTER_CMP_NOT_MATCH, + FILTER_CMP_REGEX, + FILTER_CMP_NOT_REGEX, +}; + +enum filter_exp_type { + FILTER_EXP_NONE, + FILTER_EXP_ADD, + FILTER_EXP_SUB, + FILTER_EXP_MUL, + FILTER_EXP_DIV, + FILTER_EXP_MOD, + FILTER_EXP_RSHIFT, + FILTER_EXP_LSHIFT, + FILTER_EXP_AND, + FILTER_EXP_OR, + FILTER_EXP_XOR, + FILTER_EXP_NOT, +}; + +enum filter_arg_type { + FILTER_ARG_NONE, + FILTER_ARG_BOOLEAN, + FILTER_ARG_VALUE, + FILTER_ARG_FIELD, + FILTER_ARG_EXP, + FILTER_ARG_OP, + FILTER_ARG_NUM, + FILTER_ARG_STR, +}; + +enum filter_value_type { + FILTER_NUMBER, + FILTER_STRING, + FILTER_CHAR +}; + +struct fliter_arg; + +struct filter_arg_boolean { + enum filter_boolean_type value; +}; + +struct filter_arg_field { + struct format_field *field; +}; + +struct filter_arg_value { + enum filter_value_type type; + union { + char *str; + unsigned long long val; + }; +}; + +struct filter_arg_op { + enum filter_op_type type; + struct filter_arg *left; + struct filter_arg *right; +}; + +struct filter_arg_exp { + enum filter_exp_type type; + struct filter_arg *left; + struct filter_arg *right; +}; + +struct filter_arg_num { + enum filter_cmp_type type; + struct filter_arg *left; + struct filter_arg *right; +}; + +struct filter_arg_str { + enum filter_cmp_type type; + struct format_field *field; + char *val; + char *buffer; + regex_t reg; +}; + +struct filter_arg { + enum filter_arg_type type; + union { + struct filter_arg_boolean boolean; + struct filter_arg_field field; + struct filter_arg_value value; + struct filter_arg_op op; + struct filter_arg_exp exp; + struct filter_arg_num num; + struct filter_arg_str str; + }; +}; + +struct filter_type { + int event_id; + struct event_format *event; + struct filter_arg *filter; +}; + +struct event_filter { + struct pevent *pevent; + int filters; + struct filter_type *event_filters; +}; + +struct event_filter *pevent_filter_alloc(struct pevent *pevent); + +#define FILTER_NONE -2 +#define FILTER_NOEXIST -1 +#define FILTER_MISS 0 +#define FILTER_MATCH 1 + +enum filter_trivial_type { + FILTER_TRIVIAL_FALSE, + FILTER_TRIVIAL_TRUE, + FILTER_TRIVIAL_BOTH, +}; + +int pevent_filter_add_filter_str(struct event_filter *filter, + const char *filter_str, + char **error_str); + + +int pevent_filter_match(struct event_filter *filter, + struct pevent_record *record); + +int pevent_event_filtered(struct event_filter *filter, + int event_id); + +void pevent_filter_reset(struct event_filter *filter); + +void pevent_filter_clear_trivial(struct event_filter *filter, + enum filter_trivial_type type); + +void pevent_filter_free(struct event_filter *filter); + +char *pevent_filter_make_string(struct event_filter *filter, int event_id); + +int pevent_filter_remove_event(struct event_filter *filter, + int event_id); + +int pevent_filter_event_has_trivial(struct event_filter *filter, + int event_id, + enum filter_trivial_type type); + +int pevent_filter_copy(struct event_filter *dest, struct event_filter *source); + +int pevent_update_trivial(struct event_filter *dest, struct event_filter *source, + enum filter_trivial_type type); + +int pevent_filter_compare(struct event_filter *filter1, struct event_filter *filter2); + +#endif /* _PARSE_EVENTS_H */ diff --git a/tools/lib/traceevent/event-utils.h b/tools/lib/traceevent/event-utils.h new file mode 100644 index 00000000..e76c9acb --- /dev/null +++ b/tools/lib/traceevent/event-utils.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2010 Red Hat Inc, Steven Rostedt + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#ifndef __UTIL_H +#define __UTIL_H + +#include + +/* Can be overridden */ +void die(const char *fmt, ...); +void *malloc_or_die(unsigned int size); +void warning(const char *fmt, ...); +void pr_stat(const char *fmt, ...); +void vpr_stat(const char *fmt, va_list ap); + +/* Always available */ +void __die(const char *fmt, ...); +void __warning(const char *fmt, ...); +void __pr_stat(const char *fmt, ...); + +void __vdie(const char *fmt, ...); +void __vwarning(const char *fmt, ...); +void __vpr_stat(const char *fmt, ...); + +#define min(x, y) ({ \ + typeof(x) _min1 = (x); \ + typeof(y) _min2 = (y); \ + (void) (&_min1 == &_min2); \ + _min1 < _min2 ? _min1 : _min2; }) + +static inline char *strim(char *string) +{ + char *ret; + + if (!string) + return NULL; + while (*string) { + if (!isspace(*string)) + break; + string++; + } + ret = string; + + string = ret + strlen(ret) - 1; + while (string > ret) { + if (!isspace(*string)) + break; + string--; + } + string[1] = 0; + + return ret; +} + +static inline int has_text(const char *text) +{ + if (!text) + return 0; + + while (*text) { + if (!isspace(*text)) + return 1; + text++; + } + + return 0; +} + +#endif diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c new file mode 100644 index 00000000..2500e755 --- /dev/null +++ b/tools/lib/traceevent/parse-filter.c @@ -0,0 +1,2303 @@ +/* + * Copyright (C) 2010 Red Hat Inc, Steven Rostedt + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#include +#include +#include +#include +#include +#include + +#include "event-parse.h" +#include "event-utils.h" + +#define COMM "COMM" + +static struct format_field comm = { + .name = "COMM", +}; + +struct event_list { + struct event_list *next; + struct event_format *event; +}; + +#define MAX_ERR_STR_SIZE 256 + +static void show_error(char **error_str, const char *fmt, ...) +{ + unsigned long long index; + const char *input; + char *error; + va_list ap; + int len; + int i; + + if (!error_str) + return; + + input = pevent_get_input_buf(); + index = pevent_get_input_buf_ptr(); + len = input ? strlen(input) : 0; + + error = malloc_or_die(MAX_ERR_STR_SIZE + (len*2) + 3); + + if (len) { + strcpy(error, input); + error[len] = '\n'; + for (i = 1; i < len && i < index; i++) + error[len+i] = ' '; + error[len + i] = '^'; + error[len + i + 1] = '\n'; + len += i+2; + } + + va_start(ap, fmt); + vsnprintf(error + len, MAX_ERR_STR_SIZE, fmt, ap); + va_end(ap); + + *error_str = error; +} + +static void free_token(char *token) +{ + pevent_free_token(token); +} + +static enum event_type read_token(char **tok) +{ + enum event_type type; + char *token = NULL; + + do { + free_token(token); + type = pevent_read_token(&token); + } while (type == EVENT_NEWLINE || type == EVENT_SPACE); + + /* If token is = or ! check to see if the next char is ~ */ + if (token && + (strcmp(token, "=") == 0 || strcmp(token, "!") == 0) && + pevent_peek_char() == '~') { + /* append it */ + *tok = malloc_or_die(3); + sprintf(*tok, "%c%c", *token, '~'); + free_token(token); + /* Now remove the '~' from the buffer */ + pevent_read_token(&token); + free_token(token); + } else + *tok = token; + + return type; +} + +static int filter_cmp(const void *a, const void *b) +{ + const struct filter_type *ea = a; + const struct filter_type *eb = b; + + if (ea->event_id < eb->event_id) + return -1; + + if (ea->event_id > eb->event_id) + return 1; + + return 0; +} + +static struct filter_type * +find_filter_type(struct event_filter *filter, int id) +{ + struct filter_type *filter_type; + struct filter_type key; + + key.event_id = id; + + filter_type = bsearch(&key, filter->event_filters, + filter->filters, + sizeof(*filter->event_filters), + filter_cmp); + + return filter_type; +} + +static struct filter_type * +add_filter_type(struct event_filter *filter, int id) +{ + struct filter_type *filter_type; + int i; + + filter_type = find_filter_type(filter, id); + if (filter_type) + return filter_type; + + filter->event_filters = realloc(filter->event_filters, + sizeof(*filter->event_filters) * + (filter->filters + 1)); + if (!filter->event_filters) + die("Could not allocate filter"); + + for (i = 0; i < filter->filters; i++) { + if (filter->event_filters[i].event_id > id) + break; + } + + if (i < filter->filters) + memmove(&filter->event_filters[i+1], + &filter->event_filters[i], + sizeof(*filter->event_filters) * + (filter->filters - i)); + + filter_type = &filter->event_filters[i]; + filter_type->event_id = id; + filter_type->event = pevent_find_event(filter->pevent, id); + filter_type->filter = NULL; + + filter->filters++; + + return filter_type; +} + +/** + * pevent_filter_alloc - create a new event filter + * @pevent: The pevent that this filter is associated with + */ +struct event_filter *pevent_filter_alloc(struct pevent *pevent) +{ + struct event_filter *filter; + + filter = malloc_or_die(sizeof(*filter)); + memset(filter, 0, sizeof(*filter)); + filter->pevent = pevent; + pevent_ref(pevent); + + return filter; +} + +static struct filter_arg *allocate_arg(void) +{ + struct filter_arg *arg; + + arg = malloc_or_die(sizeof(*arg)); + memset(arg, 0, sizeof(*arg)); + + return arg; +} + +static void free_arg(struct filter_arg *arg) +{ + if (!arg) + return; + + switch (arg->type) { + case FILTER_ARG_NONE: + case FILTER_ARG_BOOLEAN: + break; + + case FILTER_ARG_NUM: + free_arg(arg->num.left); + free_arg(arg->num.right); + break; + + case FILTER_ARG_EXP: + free_arg(arg->exp.left); + free_arg(arg->exp.right); + break; + + case FILTER_ARG_STR: + free(arg->str.val); + regfree(&arg->str.reg); + free(arg->str.buffer); + break; + + case FILTER_ARG_VALUE: + if (arg->value.type == FILTER_STRING || + arg->value.type == FILTER_CHAR) + free(arg->value.str); + break; + + case FILTER_ARG_OP: + free_arg(arg->op.left); + free_arg(arg->op.right); + default: + break; + } + + free(arg); +} + +static void add_event(struct event_list **events, + struct event_format *event) +{ + struct event_list *list; + + list = malloc_or_die(sizeof(*list)); + list->next = *events; + *events = list; + list->event = event; +} + +static int event_match(struct event_format *event, + regex_t *sreg, regex_t *ereg) +{ + if (sreg) { + return !regexec(sreg, event->system, 0, NULL, 0) && + !regexec(ereg, event->name, 0, NULL, 0); + } + + return !regexec(ereg, event->system, 0, NULL, 0) || + !regexec(ereg, event->name, 0, NULL, 0); +} + +static int +find_event(struct pevent *pevent, struct event_list **events, + char *sys_name, char *event_name) +{ + struct event_format *event; + regex_t ereg; + regex_t sreg; + int match = 0; + char *reg; + int ret; + int i; + + if (!event_name) { + /* if no name is given, then swap sys and name */ + event_name = sys_name; + sys_name = NULL; + } + + reg = malloc_or_die(strlen(event_name) + 3); + sprintf(reg, "^%s$", event_name); + + ret = regcomp(&ereg, reg, REG_ICASE|REG_NOSUB); + free(reg); + + if (ret) + return -1; + + if (sys_name) { + reg = malloc_or_die(strlen(sys_name) + 3); + sprintf(reg, "^%s$", sys_name); + ret = regcomp(&sreg, reg, REG_ICASE|REG_NOSUB); + free(reg); + if (ret) { + regfree(&ereg); + return -1; + } + } + + for (i = 0; i < pevent->nr_events; i++) { + event = pevent->events[i]; + if (event_match(event, sys_name ? &sreg : NULL, &ereg)) { + match = 1; + add_event(events, event); + } + } + + regfree(&ereg); + if (sys_name) + regfree(&sreg); + + if (!match) + return -1; + + return 0; +} + +static void free_events(struct event_list *events) +{ + struct event_list *event; + + while (events) { + event = events; + events = events->next; + free(event); + } +} + +static struct filter_arg * +create_arg_item(struct event_format *event, const char *token, + enum event_type type, char **error_str) +{ + struct format_field *field; + struct filter_arg *arg; + + arg = allocate_arg(); + + switch (type) { + + case EVENT_SQUOTE: + case EVENT_DQUOTE: + arg->type = FILTER_ARG_VALUE; + arg->value.type = + type == EVENT_DQUOTE ? FILTER_STRING : FILTER_CHAR; + arg->value.str = strdup(token); + if (!arg->value.str) + die("malloc string"); + break; + case EVENT_ITEM: + /* if it is a number, then convert it */ + if (isdigit(token[0])) { + arg->type = FILTER_ARG_VALUE; + arg->value.type = FILTER_NUMBER; + arg->value.val = strtoull(token, NULL, 0); + break; + } + /* Consider this a field */ + field = pevent_find_any_field(event, token); + if (!field) { + if (strcmp(token, COMM) != 0) { + /* not a field, Make it false */ + arg->type = FILTER_ARG_BOOLEAN; + arg->boolean.value = FILTER_FALSE; + break; + } + /* If token is 'COMM' then it is special */ + field = &comm; + } + arg->type = FILTER_ARG_FIELD; + arg->field.field = field; + break; + default: + free_arg(arg); + show_error(error_str, "expected a value but found %s", + token); + return NULL; + } + return arg; +} + +static struct filter_arg * +create_arg_op(enum filter_op_type btype) +{ + struct filter_arg *arg; + + arg = allocate_arg(); + arg->type = FILTER_ARG_OP; + arg->op.type = btype; + + return arg; +} + +static struct filter_arg * +create_arg_exp(enum filter_exp_type etype) +{ + struct filter_arg *arg; + + arg = allocate_arg(); + arg->type = FILTER_ARG_EXP; + arg->op.type = etype; + + return arg; +} + +static struct filter_arg * +create_arg_cmp(enum filter_exp_type etype) +{ + struct filter_arg *arg; + + arg = allocate_arg(); + /* Use NUM and change if necessary */ + arg->type = FILTER_ARG_NUM; + arg->op.type = etype; + + return arg; +} + +static int add_right(struct filter_arg *op, struct filter_arg *arg, + char **error_str) +{ + struct filter_arg *left; + char *str; + int op_type; + int ret; + + switch (op->type) { + case FILTER_ARG_EXP: + if (op->exp.right) + goto out_fail; + op->exp.right = arg; + break; + + case FILTER_ARG_OP: + if (op->op.right) + goto out_fail; + op->op.right = arg; + break; + + case FILTER_ARG_NUM: + if (op->op.right) + goto out_fail; + /* + * The arg must be num, str, or field + */ + switch (arg->type) { + case FILTER_ARG_VALUE: + case FILTER_ARG_FIELD: + break; + default: + show_error(error_str, + "Illegal rvalue"); + return -1; + } + + /* + * Depending on the type, we may need to + * convert this to a string or regex. + */ + switch (arg->value.type) { + case FILTER_CHAR: + /* + * A char should be converted to number if + * the string is 1 byte, and the compare + * is not a REGEX. + */ + if (strlen(arg->value.str) == 1 && + op->num.type != FILTER_CMP_REGEX && + op->num.type != FILTER_CMP_NOT_REGEX) { + arg->value.type = FILTER_NUMBER; + goto do_int; + } + /* fall through */ + case FILTER_STRING: + + /* convert op to a string arg */ + op_type = op->num.type; + left = op->num.left; + str = arg->value.str; + + /* reset the op for the new field */ + memset(op, 0, sizeof(*op)); + + /* + * If left arg was a field not found then + * NULL the entire op. + */ + if (left->type == FILTER_ARG_BOOLEAN) { + free_arg(left); + free_arg(arg); + op->type = FILTER_ARG_BOOLEAN; + op->boolean.value = FILTER_FALSE; + break; + } + + /* Left arg must be a field */ + if (left->type != FILTER_ARG_FIELD) { + show_error(error_str, + "Illegal lvalue for string comparison"); + return -1; + } + + /* Make sure this is a valid string compare */ + switch (op_type) { + case FILTER_CMP_EQ: + op_type = FILTER_CMP_MATCH; + break; + case FILTER_CMP_NE: + op_type = FILTER_CMP_NOT_MATCH; + break; + + case FILTER_CMP_REGEX: + case FILTER_CMP_NOT_REGEX: + ret = regcomp(&op->str.reg, str, REG_ICASE|REG_NOSUB); + if (ret) { + show_error(error_str, + "RegEx '%s' did not compute", + str); + return -1; + } + break; + default: + show_error(error_str, + "Illegal comparison for string"); + return -1; + } + + op->type = FILTER_ARG_STR; + op->str.type = op_type; + op->str.field = left->field.field; + op->str.val = strdup(str); + if (!op->str.val) + die("malloc string"); + /* + * Need a buffer to copy data for tests + */ + op->str.buffer = malloc_or_die(op->str.field->size + 1); + /* Null terminate this buffer */ + op->str.buffer[op->str.field->size] = 0; + + /* We no longer have left or right args */ + free_arg(arg); + free_arg(left); + + break; + + case FILTER_NUMBER: + + do_int: + switch (op->num.type) { + case FILTER_CMP_REGEX: + case FILTER_CMP_NOT_REGEX: + show_error(error_str, + "Op not allowed with integers"); + return -1; + + default: + break; + } + + /* numeric compare */ + op->num.right = arg; + break; + default: + goto out_fail; + } + break; + default: + goto out_fail; + } + + return 0; + + out_fail: + show_error(error_str, + "Syntax error"); + return -1; +} + +static struct filter_arg * +rotate_op_right(struct filter_arg *a, struct filter_arg *b) +{ + struct filter_arg *arg; + + arg = a->op.right; + a->op.right = b; + return arg; +} + +static int add_left(struct filter_arg *op, struct filter_arg *arg) +{ + switch (op->type) { + case FILTER_ARG_EXP: + if (arg->type == FILTER_ARG_OP) + arg = rotate_op_right(arg, op); + op->exp.left = arg; + break; + + case FILTER_ARG_OP: + op->op.left = arg; + break; + case FILTER_ARG_NUM: + if (arg->type == FILTER_ARG_OP) + arg = rotate_op_right(arg, op); + + /* left arg of compares must be a field */ + if (arg->type != FILTER_ARG_FIELD && + arg->type != FILTER_ARG_BOOLEAN) + return -1; + op->num.left = arg; + break; + default: + return -1; + } + return 0; +} + +enum op_type { + OP_NONE, + OP_BOOL, + OP_NOT, + OP_EXP, + OP_CMP, +}; + +static enum op_type process_op(const char *token, + enum filter_op_type *btype, + enum filter_cmp_type *ctype, + enum filter_exp_type *etype) +{ + *btype = FILTER_OP_NOT; + *etype = FILTER_EXP_NONE; + *ctype = FILTER_CMP_NONE; + + if (strcmp(token, "&&") == 0) + *btype = FILTER_OP_AND; + else if (strcmp(token, "||") == 0) + *btype = FILTER_OP_OR; + else if (strcmp(token, "!") == 0) + return OP_NOT; + + if (*btype != FILTER_OP_NOT) + return OP_BOOL; + + /* Check for value expressions */ + if (strcmp(token, "+") == 0) { + *etype = FILTER_EXP_ADD; + } else if (strcmp(token, "-") == 0) { + *etype = FILTER_EXP_SUB; + } else if (strcmp(token, "*") == 0) { + *etype = FILTER_EXP_MUL; + } else if (strcmp(token, "/") == 0) { + *etype = FILTER_EXP_DIV; + } else if (strcmp(token, "%") == 0) { + *etype = FILTER_EXP_MOD; + } else if (strcmp(token, ">>") == 0) { + *etype = FILTER_EXP_RSHIFT; + } else if (strcmp(token, "<<") == 0) { + *etype = FILTER_EXP_LSHIFT; + } else if (strcmp(token, "&") == 0) { + *etype = FILTER_EXP_AND; + } else if (strcmp(token, "|") == 0) { + *etype = FILTER_EXP_OR; + } else if (strcmp(token, "^") == 0) { + *etype = FILTER_EXP_XOR; + } else if (strcmp(token, "~") == 0) + *etype = FILTER_EXP_NOT; + + if (*etype != FILTER_EXP_NONE) + return OP_EXP; + + /* Check for compares */ + if (strcmp(token, "==") == 0) + *ctype = FILTER_CMP_EQ; + else if (strcmp(token, "!=") == 0) + *ctype = FILTER_CMP_NE; + else if (strcmp(token, "<") == 0) + *ctype = FILTER_CMP_LT; + else if (strcmp(token, ">") == 0) + *ctype = FILTER_CMP_GT; + else if (strcmp(token, "<=") == 0) + *ctype = FILTER_CMP_LE; + else if (strcmp(token, ">=") == 0) + *ctype = FILTER_CMP_GE; + else if (strcmp(token, "=~") == 0) + *ctype = FILTER_CMP_REGEX; + else if (strcmp(token, "!~") == 0) + *ctype = FILTER_CMP_NOT_REGEX; + else + return OP_NONE; + + return OP_CMP; +} + +static int check_op_done(struct filter_arg *arg) +{ + switch (arg->type) { + case FILTER_ARG_EXP: + return arg->exp.right != NULL; + + case FILTER_ARG_OP: + return arg->op.right != NULL; + + case FILTER_ARG_NUM: + return arg->num.right != NULL; + + case FILTER_ARG_STR: + /* A string conversion is always done */ + return 1; + + case FILTER_ARG_BOOLEAN: + /* field not found, is ok */ + return 1; + + default: + return 0; + } +} + +enum filter_vals { + FILTER_VAL_NORM, + FILTER_VAL_FALSE, + FILTER_VAL_TRUE, +}; + +void reparent_op_arg(struct filter_arg *parent, struct filter_arg *old_child, + struct filter_arg *arg) +{ + struct filter_arg *other_child; + struct filter_arg **ptr; + + if (parent->type != FILTER_ARG_OP && + arg->type != FILTER_ARG_OP) + die("can not reparent other than OP"); + + /* Get the sibling */ + if (old_child->op.right == arg) { + ptr = &old_child->op.right; + other_child = old_child->op.left; + } else if (old_child->op.left == arg) { + ptr = &old_child->op.left; + other_child = old_child->op.right; + } else + die("Error in reparent op, find other child"); + + /* Detach arg from old_child */ + *ptr = NULL; + + /* Check for root */ + if (parent == old_child) { + free_arg(other_child); + *parent = *arg; + /* Free arg without recussion */ + free(arg); + return; + } + + if (parent->op.right == old_child) + ptr = &parent->op.right; + else if (parent->op.left == old_child) + ptr = &parent->op.left; + else + die("Error in reparent op"); + *ptr = arg; + + free_arg(old_child); +} + +enum filter_vals test_arg(struct filter_arg *parent, struct filter_arg *arg) +{ + enum filter_vals lval, rval; + + switch (arg->type) { + + /* bad case */ + case FILTER_ARG_BOOLEAN: + return FILTER_VAL_FALSE + arg->boolean.value; + + /* good cases: */ + case FILTER_ARG_STR: + case FILTER_ARG_VALUE: + case FILTER_ARG_FIELD: + return FILTER_VAL_NORM; + + case FILTER_ARG_EXP: + lval = test_arg(arg, arg->exp.left); + if (lval != FILTER_VAL_NORM) + return lval; + rval = test_arg(arg, arg->exp.right); + if (rval != FILTER_VAL_NORM) + return rval; + return FILTER_VAL_NORM; + + case FILTER_ARG_NUM: + lval = test_arg(arg, arg->num.left); + if (lval != FILTER_VAL_NORM) + return lval; + rval = test_arg(arg, arg->num.right); + if (rval != FILTER_VAL_NORM) + return rval; + return FILTER_VAL_NORM; + + case FILTER_ARG_OP: + if (arg->op.type != FILTER_OP_NOT) { + lval = test_arg(arg, arg->op.left); + switch (lval) { + case FILTER_VAL_NORM: + break; + case FILTER_VAL_TRUE: + if (arg->op.type == FILTER_OP_OR) + return FILTER_VAL_TRUE; + rval = test_arg(arg, arg->op.right); + if (rval != FILTER_VAL_NORM) + return rval; + + reparent_op_arg(parent, arg, arg->op.right); + return FILTER_VAL_NORM; + + case FILTER_VAL_FALSE: + if (arg->op.type == FILTER_OP_AND) + return FILTER_VAL_FALSE; + rval = test_arg(arg, arg->op.right); + if (rval != FILTER_VAL_NORM) + return rval; + + reparent_op_arg(parent, arg, arg->op.right); + return FILTER_VAL_NORM; + } + } + + rval = test_arg(arg, arg->op.right); + switch (rval) { + case FILTER_VAL_NORM: + break; + case FILTER_VAL_TRUE: + if (arg->op.type == FILTER_OP_OR) + return FILTER_VAL_TRUE; + if (arg->op.type == FILTER_OP_NOT) + return FILTER_VAL_FALSE; + + reparent_op_arg(parent, arg, arg->op.left); + return FILTER_VAL_NORM; + + case FILTER_VAL_FALSE: + if (arg->op.type == FILTER_OP_AND) + return FILTER_VAL_FALSE; + if (arg->op.type == FILTER_OP_NOT) + return FILTER_VAL_TRUE; + + reparent_op_arg(parent, arg, arg->op.left); + return FILTER_VAL_NORM; + } + + return FILTER_VAL_NORM; + default: + die("bad arg in filter tree"); + } + return FILTER_VAL_NORM; +} + +/* Remove any unknown event fields */ +static struct filter_arg *collapse_tree(struct filter_arg *arg) +{ + enum filter_vals ret; + + ret = test_arg(arg, arg); + switch (ret) { + case FILTER_VAL_NORM: + return arg; + + case FILTER_VAL_TRUE: + case FILTER_VAL_FALSE: + free_arg(arg); + arg = allocate_arg(); + arg->type = FILTER_ARG_BOOLEAN; + arg->boolean.value = ret == FILTER_VAL_TRUE; + } + + return arg; +} + +static int +process_filter(struct event_format *event, struct filter_arg **parg, + char **error_str, int not) +{ + enum event_type type; + char *token = NULL; + struct filter_arg *current_op = NULL; + struct filter_arg *current_exp = NULL; + struct filter_arg *left_item = NULL; + struct filter_arg *arg = NULL; + enum op_type op_type; + enum filter_op_type btype; + enum filter_exp_type etype; + enum filter_cmp_type ctype; + int ret; + + *parg = NULL; + + do { + free(token); + type = read_token(&token); + switch (type) { + case EVENT_SQUOTE: + case EVENT_DQUOTE: + case EVENT_ITEM: + arg = create_arg_item(event, token, type, error_str); + if (!arg) + goto fail; + if (!left_item) + left_item = arg; + else if (current_exp) { + ret = add_right(current_exp, arg, error_str); + if (ret < 0) + goto fail; + left_item = NULL; + /* Not's only one one expression */ + if (not) { + arg = NULL; + if (current_op) + goto fail_print; + free(token); + *parg = current_exp; + return 0; + } + } else + goto fail_print; + arg = NULL; + break; + + case EVENT_DELIM: + if (*token == ',') { + show_error(error_str, + "Illegal token ','"); + goto fail; + } + + if (*token == '(') { + if (left_item) { + show_error(error_str, + "Open paren can not come after item"); + goto fail; + } + if (current_exp) { + show_error(error_str, + "Open paren can not come after expression"); + goto fail; + } + + ret = process_filter(event, &arg, error_str, 0); + if (ret != 1) { + if (ret == 0) + show_error(error_str, + "Unbalanced number of '('"); + goto fail; + } + ret = 0; + + /* A not wants just one expression */ + if (not) { + if (current_op) + goto fail_print; + *parg = arg; + return 0; + } + + if (current_op) + ret = add_right(current_op, arg, error_str); + else + current_exp = arg; + + if (ret < 0) + goto fail; + + } else { /* ')' */ + if (!current_op && !current_exp) + goto fail_print; + + /* Make sure everything is finished at this level */ + if (current_exp && !check_op_done(current_exp)) + goto fail_print; + if (current_op && !check_op_done(current_op)) + goto fail_print; + + if (current_op) + *parg = current_op; + else + *parg = current_exp; + return 1; + } + break; + + case EVENT_OP: + op_type = process_op(token, &btype, &ctype, &etype); + + /* All expect a left arg except for NOT */ + switch (op_type) { + case OP_BOOL: + /* Logic ops need a left expression */ + if (!current_exp && !current_op) + goto fail_print; + /* fall through */ + case OP_NOT: + /* logic only processes ops and exp */ + if (left_item) + goto fail_print; + break; + case OP_EXP: + case OP_CMP: + if (!left_item) + goto fail_print; + break; + case OP_NONE: + show_error(error_str, + "Unknown op token %s", token); + goto fail; + } + + ret = 0; + switch (op_type) { + case OP_BOOL: + arg = create_arg_op(btype); + if (current_op) + ret = add_left(arg, current_op); + else + ret = add_left(arg, current_exp); + current_op = arg; + current_exp = NULL; + break; + + case OP_NOT: + arg = create_arg_op(btype); + if (current_op) + ret = add_right(current_op, arg, error_str); + if (ret < 0) + goto fail; + current_exp = arg; + ret = process_filter(event, &arg, error_str, 1); + if (ret < 0) + goto fail; + ret = add_right(current_exp, arg, error_str); + if (ret < 0) + goto fail; + break; + + case OP_EXP: + case OP_CMP: + if (op_type == OP_EXP) + arg = create_arg_exp(etype); + else + arg = create_arg_cmp(ctype); + + if (current_op) + ret = add_right(current_op, arg, error_str); + if (ret < 0) + goto fail; + ret = add_left(arg, left_item); + if (ret < 0) { + arg = NULL; + goto fail_print; + } + current_exp = arg; + break; + default: + break; + } + arg = NULL; + if (ret < 0) + goto fail_print; + break; + case EVENT_NONE: + break; + default: + goto fail_print; + } + } while (type != EVENT_NONE); + + if (!current_op && !current_exp) + goto fail_print; + + if (!current_op) + current_op = current_exp; + + current_op = collapse_tree(current_op); + + *parg = current_op; + + return 0; + + fail_print: + show_error(error_str, "Syntax error"); + fail: + free_arg(current_op); + free_arg(current_exp); + free_arg(arg); + free(token); + return -1; +} + +static int +process_event(struct event_format *event, const char *filter_str, + struct filter_arg **parg, char **error_str) +{ + int ret; + + pevent_buffer_init(filter_str, strlen(filter_str)); + + ret = process_filter(event, parg, error_str, 0); + if (ret == 1) { + show_error(error_str, + "Unbalanced number of ')'"); + return -1; + } + if (ret < 0) + return ret; + + /* If parg is NULL, then make it into FALSE */ + if (!*parg) { + *parg = allocate_arg(); + (*parg)->type = FILTER_ARG_BOOLEAN; + (*parg)->boolean.value = FILTER_FALSE; + } + + return 0; +} + +static int filter_event(struct event_filter *filter, + struct event_format *event, + const char *filter_str, char **error_str) +{ + struct filter_type *filter_type; + struct filter_arg *arg; + int ret; + + if (filter_str) { + ret = process_event(event, filter_str, &arg, error_str); + if (ret < 0) + return ret; + + } else { + /* just add a TRUE arg */ + arg = allocate_arg(); + arg->type = FILTER_ARG_BOOLEAN; + arg->boolean.value = FILTER_TRUE; + } + + filter_type = add_filter_type(filter, event->id); + if (filter_type->filter) + free_arg(filter_type->filter); + filter_type->filter = arg; + + return 0; +} + +/** + * pevent_filter_add_filter_str - add a new filter + * @filter: the event filter to add to + * @filter_str: the filter string that contains the filter + * @error_str: string containing reason for failed filter + * + * Returns 0 if the filter was successfully added + * -1 if there was an error. + * + * On error, if @error_str points to a string pointer, + * it is set to the reason that the filter failed. + * This string must be freed with "free". + */ +int pevent_filter_add_filter_str(struct event_filter *filter, + const char *filter_str, + char **error_str) +{ + struct pevent *pevent = filter->pevent; + struct event_list *event; + struct event_list *events = NULL; + const char *filter_start; + const char *next_event; + char *this_event; + char *event_name = NULL; + char *sys_name = NULL; + char *sp; + int rtn = 0; + int len; + int ret; + + /* clear buffer to reset show error */ + pevent_buffer_init("", 0); + + if (error_str) + *error_str = NULL; + + filter_start = strchr(filter_str, ':'); + if (filter_start) + len = filter_start - filter_str; + else + len = strlen(filter_str); + + + do { + next_event = strchr(filter_str, ','); + if (next_event && + (!filter_start || next_event < filter_start)) + len = next_event - filter_str; + else if (filter_start) + len = filter_start - filter_str; + else + len = strlen(filter_str); + + this_event = malloc_or_die(len + 1); + memcpy(this_event, filter_str, len); + this_event[len] = 0; + + if (next_event) + next_event++; + + filter_str = next_event; + + sys_name = strtok_r(this_event, "/", &sp); + event_name = strtok_r(NULL, "/", &sp); + + if (!sys_name) { + show_error(error_str, "No filter found"); + /* This can only happen when events is NULL, but still */ + free_events(events); + free(this_event); + return -1; + } + + /* Find this event */ + ret = find_event(pevent, &events, strim(sys_name), strim(event_name)); + if (ret < 0) { + if (event_name) + show_error(error_str, + "No event found under '%s.%s'", + sys_name, event_name); + else + show_error(error_str, + "No event found under '%s'", + sys_name); + free_events(events); + free(this_event); + return -1; + } + free(this_event); + } while (filter_str); + + /* Skip the ':' */ + if (filter_start) + filter_start++; + + /* filter starts here */ + for (event = events; event; event = event->next) { + ret = filter_event(filter, event->event, filter_start, + error_str); + /* Failures are returned if a parse error happened */ + if (ret < 0) + rtn = ret; + + if (ret >= 0 && pevent->test_filters) { + char *test; + test = pevent_filter_make_string(filter, event->event->id); + printf(" '%s: %s'\n", event->event->name, test); + free(test); + } + } + + free_events(events); + + if (rtn >= 0 && pevent->test_filters) + exit(0); + + return rtn; +} + +static void free_filter_type(struct filter_type *filter_type) +{ + free_arg(filter_type->filter); +} + +/** + * pevent_filter_remove_event - remove a filter for an event + * @filter: the event filter to remove from + * @event_id: the event to remove a filter for + * + * Removes the filter saved for an event defined by @event_id + * from the @filter. + * + * Returns 1: if an event was removed + * 0: if the event was not found + */ +int pevent_filter_remove_event(struct event_filter *filter, + int event_id) +{ + struct filter_type *filter_type; + unsigned long len; + + if (!filter->filters) + return 0; + + filter_type = find_filter_type(filter, event_id); + + if (!filter_type) + return 0; + + free_filter_type(filter_type); + + /* The filter_type points into the event_filters array */ + len = (unsigned long)(filter->event_filters + filter->filters) - + (unsigned long)(filter_type + 1); + + memmove(filter_type, filter_type + 1, len); + filter->filters--; + + memset(&filter->event_filters[filter->filters], 0, + sizeof(*filter_type)); + + return 1; +} + +/** + * pevent_filter_reset - clear all filters in a filter + * @filter: the event filter to reset + * + * Removes all filters from a filter and resets it. + */ +void pevent_filter_reset(struct event_filter *filter) +{ + int i; + + for (i = 0; i < filter->filters; i++) + free_filter_type(&filter->event_filters[i]); + + free(filter->event_filters); + filter->filters = 0; + filter->event_filters = NULL; +} + +void pevent_filter_free(struct event_filter *filter) +{ + pevent_unref(filter->pevent); + + pevent_filter_reset(filter); + + free(filter); +} + +static char *arg_to_str(struct event_filter *filter, struct filter_arg *arg); + +static int copy_filter_type(struct event_filter *filter, + struct event_filter *source, + struct filter_type *filter_type) +{ + struct filter_arg *arg; + struct event_format *event; + const char *sys; + const char *name; + char *str; + + /* Can't assume that the pevent's are the same */ + sys = filter_type->event->system; + name = filter_type->event->name; + event = pevent_find_event_by_name(filter->pevent, sys, name); + if (!event) + return -1; + + str = arg_to_str(source, filter_type->filter); + if (!str) + return -1; + + if (strcmp(str, "TRUE") == 0 || strcmp(str, "FALSE") == 0) { + /* Add trivial event */ + arg = allocate_arg(); + arg->type = FILTER_ARG_BOOLEAN; + if (strcmp(str, "TRUE") == 0) + arg->boolean.value = 1; + else + arg->boolean.value = 0; + + filter_type = add_filter_type(filter, event->id); + filter_type->filter = arg; + + free(str); + return 0; + } + + filter_event(filter, event, str, NULL); + free(str); + + return 0; +} + +/** + * pevent_filter_copy - copy a filter using another filter + * @dest - the filter to copy to + * @source - the filter to copy from + * + * Returns 0 on success and -1 if not all filters were copied + */ +int pevent_filter_copy(struct event_filter *dest, struct event_filter *source) +{ + int ret = 0; + int i; + + pevent_filter_reset(dest); + + for (i = 0; i < source->filters; i++) { + if (copy_filter_type(dest, source, &source->event_filters[i])) + ret = -1; + } + return ret; +} + + +/** + * pevent_update_trivial - update the trivial filters with the given filter + * @dest - the filter to update + * @source - the filter as the source of the update + * @type - the type of trivial filter to update. + * + * Scan dest for trivial events matching @type to replace with the source. + * + * Returns 0 on success and -1 if there was a problem updating, but + * events may have still been updated on error. + */ +int pevent_update_trivial(struct event_filter *dest, struct event_filter *source, + enum filter_trivial_type type) +{ + struct pevent *src_pevent; + struct pevent *dest_pevent; + struct event_format *event; + struct filter_type *filter_type; + struct filter_arg *arg; + char *str; + int i; + + src_pevent = source->pevent; + dest_pevent = dest->pevent; + + /* Do nothing if either of the filters has nothing to filter */ + if (!dest->filters || !source->filters) + return 0; + + for (i = 0; i < dest->filters; i++) { + filter_type = &dest->event_filters[i]; + arg = filter_type->filter; + if (arg->type != FILTER_ARG_BOOLEAN) + continue; + if ((arg->boolean.value && type == FILTER_TRIVIAL_FALSE) || + (!arg->boolean.value && type == FILTER_TRIVIAL_TRUE)) + continue; + + event = filter_type->event; + + if (src_pevent != dest_pevent) { + /* do a look up */ + event = pevent_find_event_by_name(src_pevent, + event->system, + event->name); + if (!event) + return -1; + } + + str = pevent_filter_make_string(source, event->id); + if (!str) + continue; + + /* Don't bother if the filter is trivial too */ + if (strcmp(str, "TRUE") != 0 && strcmp(str, "FALSE") != 0) + filter_event(dest, event, str, NULL); + free(str); + } + return 0; +} + +/** + * pevent_filter_clear_trivial - clear TRUE and FALSE filters + * @filter: the filter to remove trivial filters from + * @type: remove only true, false, or both + * + * Removes filters that only contain a TRUE or FALES boolean arg. + */ +void pevent_filter_clear_trivial(struct event_filter *filter, + enum filter_trivial_type type) +{ + struct filter_type *filter_type; + int count = 0; + int *ids = NULL; + int i; + + if (!filter->filters) + return; + + /* + * Two steps, first get all ids with trivial filters. + * then remove those ids. + */ + for (i = 0; i < filter->filters; i++) { + filter_type = &filter->event_filters[i]; + if (filter_type->filter->type != FILTER_ARG_BOOLEAN) + continue; + switch (type) { + case FILTER_TRIVIAL_FALSE: + if (filter_type->filter->boolean.value) + continue; + case FILTER_TRIVIAL_TRUE: + if (!filter_type->filter->boolean.value) + continue; + default: + break; + } + + ids = realloc(ids, sizeof(*ids) * (count + 1)); + if (!ids) + die("Can't allocate ids"); + ids[count++] = filter_type->event_id; + } + + if (!count) + return; + + for (i = 0; i < count; i++) + pevent_filter_remove_event(filter, ids[i]); + + free(ids); +} + +/** + * pevent_filter_event_has_trivial - return true event contains trivial filter + * @filter: the filter with the information + * @event_id: the id of the event to test + * @type: trivial type to test for (TRUE, FALSE, EITHER) + * + * Returns 1 if the event contains a matching trivial type + * otherwise 0. + */ +int pevent_filter_event_has_trivial(struct event_filter *filter, + int event_id, + enum filter_trivial_type type) +{ + struct filter_type *filter_type; + + if (!filter->filters) + return 0; + + filter_type = find_filter_type(filter, event_id); + + if (!filter_type) + return 0; + + if (filter_type->filter->type != FILTER_ARG_BOOLEAN) + return 0; + + switch (type) { + case FILTER_TRIVIAL_FALSE: + return !filter_type->filter->boolean.value; + + case FILTER_TRIVIAL_TRUE: + return filter_type->filter->boolean.value; + default: + return 1; + } +} + +static int test_filter(struct event_format *event, + struct filter_arg *arg, struct pevent_record *record); + +static const char * +get_comm(struct event_format *event, struct pevent_record *record) +{ + const char *comm; + int pid; + + pid = pevent_data_pid(event->pevent, record); + comm = pevent_data_comm_from_pid(event->pevent, pid); + return comm; +} + +static unsigned long long +get_value(struct event_format *event, + struct format_field *field, struct pevent_record *record) +{ + unsigned long long val; + + /* Handle our dummy "comm" field */ + if (field == &comm) { + const char *name; + + name = get_comm(event, record); + return (unsigned long)name; + } + + pevent_read_number_field(field, record->data, &val); + + if (!(field->flags & FIELD_IS_SIGNED)) + return val; + + switch (field->size) { + case 1: + return (char)val; + case 2: + return (short)val; + case 4: + return (int)val; + case 8: + return (long long)val; + } + return val; +} + +static unsigned long long +get_arg_value(struct event_format *event, struct filter_arg *arg, struct pevent_record *record); + +static unsigned long long +get_exp_value(struct event_format *event, struct filter_arg *arg, struct pevent_record *record) +{ + unsigned long long lval, rval; + + lval = get_arg_value(event, arg->exp.left, record); + rval = get_arg_value(event, arg->exp.right, record); + + switch (arg->exp.type) { + case FILTER_EXP_ADD: + return lval + rval; + + case FILTER_EXP_SUB: + return lval - rval; + + case FILTER_EXP_MUL: + return lval * rval; + + case FILTER_EXP_DIV: + return lval / rval; + + case FILTER_EXP_MOD: + return lval % rval; + + case FILTER_EXP_RSHIFT: + return lval >> rval; + + case FILTER_EXP_LSHIFT: + return lval << rval; + + case FILTER_EXP_AND: + return lval & rval; + + case FILTER_EXP_OR: + return lval | rval; + + case FILTER_EXP_XOR: + return lval ^ rval; + + case FILTER_EXP_NOT: + default: + die("error in exp"); + } + return 0; +} + +static unsigned long long +get_arg_value(struct event_format *event, struct filter_arg *arg, struct pevent_record *record) +{ + switch (arg->type) { + case FILTER_ARG_FIELD: + return get_value(event, arg->field.field, record); + + case FILTER_ARG_VALUE: + if (arg->value.type != FILTER_NUMBER) + die("must have number field!"); + return arg->value.val; + + case FILTER_ARG_EXP: + return get_exp_value(event, arg, record); + + default: + die("oops in filter"); + } + return 0; +} + +static int test_num(struct event_format *event, + struct filter_arg *arg, struct pevent_record *record) +{ + unsigned long long lval, rval; + + lval = get_arg_value(event, arg->num.left, record); + rval = get_arg_value(event, arg->num.right, record); + + switch (arg->num.type) { + case FILTER_CMP_EQ: + return lval == rval; + + case FILTER_CMP_NE: + return lval != rval; + + case FILTER_CMP_GT: + return lval > rval; + + case FILTER_CMP_LT: + return lval < rval; + + case FILTER_CMP_GE: + return lval >= rval; + + case FILTER_CMP_LE: + return lval <= rval; + + default: + /* ?? */ + return 0; + } +} + +static const char *get_field_str(struct filter_arg *arg, struct pevent_record *record) +{ + struct event_format *event; + struct pevent *pevent; + unsigned long long addr; + const char *val = NULL; + char hex[64]; + + /* If the field is not a string convert it */ + if (arg->str.field->flags & FIELD_IS_STRING) { + val = record->data + arg->str.field->offset; + + /* + * We need to copy the data since we can't be sure the field + * is null terminated. + */ + if (*(val + arg->str.field->size - 1)) { + /* copy it */ + memcpy(arg->str.buffer, val, arg->str.field->size); + /* the buffer is already NULL terminated */ + val = arg->str.buffer; + } + + } else { + event = arg->str.field->event; + pevent = event->pevent; + addr = get_value(event, arg->str.field, record); + + if (arg->str.field->flags & (FIELD_IS_POINTER | FIELD_IS_LONG)) + /* convert to a kernel symbol */ + val = pevent_find_function(pevent, addr); + + if (val == NULL) { + /* just use the hex of the string name */ + snprintf(hex, 64, "0x%llx", addr); + val = hex; + } + } + + return val; +} + +static int test_str(struct event_format *event, + struct filter_arg *arg, struct pevent_record *record) +{ + const char *val; + + if (arg->str.field == &comm) + val = get_comm(event, record); + else + val = get_field_str(arg, record); + + switch (arg->str.type) { + case FILTER_CMP_MATCH: + return strcmp(val, arg->str.val) == 0; + + case FILTER_CMP_NOT_MATCH: + return strcmp(val, arg->str.val) != 0; + + case FILTER_CMP_REGEX: + /* Returns zero on match */ + return !regexec(&arg->str.reg, val, 0, NULL, 0); + + case FILTER_CMP_NOT_REGEX: + return regexec(&arg->str.reg, val, 0, NULL, 0); + + default: + /* ?? */ + return 0; + } +} + +static int test_op(struct event_format *event, + struct filter_arg *arg, struct pevent_record *record) +{ + switch (arg->op.type) { + case FILTER_OP_AND: + return test_filter(event, arg->op.left, record) && + test_filter(event, arg->op.right, record); + + case FILTER_OP_OR: + return test_filter(event, arg->op.left, record) || + test_filter(event, arg->op.right, record); + + case FILTER_OP_NOT: + return !test_filter(event, arg->op.right, record); + + default: + /* ?? */ + return 0; + } +} + +static int test_filter(struct event_format *event, + struct filter_arg *arg, struct pevent_record *record) +{ + switch (arg->type) { + case FILTER_ARG_BOOLEAN: + /* easy case */ + return arg->boolean.value; + + case FILTER_ARG_OP: + return test_op(event, arg, record); + + case FILTER_ARG_NUM: + return test_num(event, arg, record); + + case FILTER_ARG_STR: + return test_str(event, arg, record); + + case FILTER_ARG_EXP: + case FILTER_ARG_VALUE: + case FILTER_ARG_FIELD: + /* + * Expressions, fields and values evaluate + * to true if they return non zero + */ + return !!get_arg_value(event, arg, record); + + default: + die("oops!"); + /* ?? */ + return 0; + } +} + +/** + * pevent_event_filtered - return true if event has filter + * @filter: filter struct with filter information + * @event_id: event id to test if filter exists + * + * Returns 1 if filter found for @event_id + * otherwise 0; + */ +int pevent_event_filtered(struct event_filter *filter, + int event_id) +{ + struct filter_type *filter_type; + + if (!filter->filters) + return 0; + + filter_type = find_filter_type(filter, event_id); + + return filter_type ? 1 : 0; +} + +/** + * pevent_filter_match - test if a record matches a filter + * @filter: filter struct with filter information + * @record: the record to test against the filter + * + * Returns: + * 1 - filter found for event and @record matches + * 0 - filter found for event and @record does not match + * -1 - no filter found for @record's event + * -2 - if no filters exist + */ +int pevent_filter_match(struct event_filter *filter, + struct pevent_record *record) +{ + struct pevent *pevent = filter->pevent; + struct filter_type *filter_type; + int event_id; + + if (!filter->filters) + return FILTER_NONE; + + event_id = pevent_data_type(pevent, record); + + filter_type = find_filter_type(filter, event_id); + + if (!filter_type) + return FILTER_NOEXIST; + + return test_filter(filter_type->event, filter_type->filter, record) ? + FILTER_MATCH : FILTER_MISS; +} + +static char *op_to_str(struct event_filter *filter, struct filter_arg *arg) +{ + char *str = NULL; + char *left = NULL; + char *right = NULL; + char *op = NULL; + int left_val = -1; + int right_val = -1; + int val; + int len; + + switch (arg->op.type) { + case FILTER_OP_AND: + op = "&&"; + /* fall through */ + case FILTER_OP_OR: + if (!op) + op = "||"; + + left = arg_to_str(filter, arg->op.left); + right = arg_to_str(filter, arg->op.right); + if (!left || !right) + break; + + /* Try to consolidate boolean values */ + if (strcmp(left, "TRUE") == 0) + left_val = 1; + else if (strcmp(left, "FALSE") == 0) + left_val = 0; + + if (strcmp(right, "TRUE") == 0) + right_val = 1; + else if (strcmp(right, "FALSE") == 0) + right_val = 0; + + if (left_val >= 0) { + if ((arg->op.type == FILTER_OP_AND && !left_val) || + (arg->op.type == FILTER_OP_OR && left_val)) { + /* Just return left value */ + str = left; + left = NULL; + break; + } + if (right_val >= 0) { + /* just evaluate this. */ + val = 0; + switch (arg->op.type) { + case FILTER_OP_AND: + val = left_val && right_val; + break; + case FILTER_OP_OR: + val = left_val || right_val; + break; + default: + break; + } + str = malloc_or_die(6); + if (val) + strcpy(str, "TRUE"); + else + strcpy(str, "FALSE"); + break; + } + } + if (right_val >= 0) { + if ((arg->op.type == FILTER_OP_AND && !right_val) || + (arg->op.type == FILTER_OP_OR && right_val)) { + /* Just return right value */ + str = right; + right = NULL; + break; + } + /* The right value is meaningless */ + str = left; + left = NULL; + break; + } + + len = strlen(left) + strlen(right) + strlen(op) + 10; + str = malloc_or_die(len); + snprintf(str, len, "(%s) %s (%s)", + left, op, right); + break; + + case FILTER_OP_NOT: + op = "!"; + right = arg_to_str(filter, arg->op.right); + if (!right) + break; + + /* See if we can consolidate */ + if (strcmp(right, "TRUE") == 0) + right_val = 1; + else if (strcmp(right, "FALSE") == 0) + right_val = 0; + if (right_val >= 0) { + /* just return the opposite */ + str = malloc_or_die(6); + if (right_val) + strcpy(str, "FALSE"); + else + strcpy(str, "TRUE"); + break; + } + len = strlen(right) + strlen(op) + 3; + str = malloc_or_die(len); + snprintf(str, len, "%s(%s)", op, right); + break; + + default: + /* ?? */ + break; + } + free(left); + free(right); + return str; +} + +static char *val_to_str(struct event_filter *filter, struct filter_arg *arg) +{ + char *str; + + str = malloc_or_die(30); + + snprintf(str, 30, "%lld", arg->value.val); + + return str; +} + +static char *field_to_str(struct event_filter *filter, struct filter_arg *arg) +{ + return strdup(arg->field.field->name); +} + +static char *exp_to_str(struct event_filter *filter, struct filter_arg *arg) +{ + char *lstr; + char *rstr; + char *op; + char *str = NULL; + int len; + + lstr = arg_to_str(filter, arg->exp.left); + rstr = arg_to_str(filter, arg->exp.right); + if (!lstr || !rstr) + goto out; + + switch (arg->exp.type) { + case FILTER_EXP_ADD: + op = "+"; + break; + case FILTER_EXP_SUB: + op = "-"; + break; + case FILTER_EXP_MUL: + op = "*"; + break; + case FILTER_EXP_DIV: + op = "/"; + break; + case FILTER_EXP_MOD: + op = "%"; + break; + case FILTER_EXP_RSHIFT: + op = ">>"; + break; + case FILTER_EXP_LSHIFT: + op = "<<"; + break; + case FILTER_EXP_AND: + op = "&"; + break; + case FILTER_EXP_OR: + op = "|"; + break; + case FILTER_EXP_XOR: + op = "^"; + break; + default: + die("oops in exp"); + } + + len = strlen(op) + strlen(lstr) + strlen(rstr) + 4; + str = malloc_or_die(len); + snprintf(str, len, "%s %s %s", lstr, op, rstr); +out: + free(lstr); + free(rstr); + + return str; +} + +static char *num_to_str(struct event_filter *filter, struct filter_arg *arg) +{ + char *lstr; + char *rstr; + char *str = NULL; + char *op = NULL; + int len; + + lstr = arg_to_str(filter, arg->num.left); + rstr = arg_to_str(filter, arg->num.right); + if (!lstr || !rstr) + goto out; + + switch (arg->num.type) { + case FILTER_CMP_EQ: + op = "=="; + /* fall through */ + case FILTER_CMP_NE: + if (!op) + op = "!="; + /* fall through */ + case FILTER_CMP_GT: + if (!op) + op = ">"; + /* fall through */ + case FILTER_CMP_LT: + if (!op) + op = "<"; + /* fall through */ + case FILTER_CMP_GE: + if (!op) + op = ">="; + /* fall through */ + case FILTER_CMP_LE: + if (!op) + op = "<="; + + len = strlen(lstr) + strlen(op) + strlen(rstr) + 4; + str = malloc_or_die(len); + sprintf(str, "%s %s %s", lstr, op, rstr); + + break; + + default: + /* ?? */ + break; + } + +out: + free(lstr); + free(rstr); + return str; +} + +static char *str_to_str(struct event_filter *filter, struct filter_arg *arg) +{ + char *str = NULL; + char *op = NULL; + int len; + + switch (arg->str.type) { + case FILTER_CMP_MATCH: + op = "=="; + /* fall through */ + case FILTER_CMP_NOT_MATCH: + if (!op) + op = "!="; + /* fall through */ + case FILTER_CMP_REGEX: + if (!op) + op = "=~"; + /* fall through */ + case FILTER_CMP_NOT_REGEX: + if (!op) + op = "!~"; + + len = strlen(arg->str.field->name) + strlen(op) + + strlen(arg->str.val) + 6; + str = malloc_or_die(len); + snprintf(str, len, "%s %s \"%s\"", + arg->str.field->name, + op, arg->str.val); + break; + + default: + /* ?? */ + break; + } + return str; +} + +static char *arg_to_str(struct event_filter *filter, struct filter_arg *arg) +{ + char *str; + + switch (arg->type) { + case FILTER_ARG_BOOLEAN: + str = malloc_or_die(6); + if (arg->boolean.value) + strcpy(str, "TRUE"); + else + strcpy(str, "FALSE"); + return str; + + case FILTER_ARG_OP: + return op_to_str(filter, arg); + + case FILTER_ARG_NUM: + return num_to_str(filter, arg); + + case FILTER_ARG_STR: + return str_to_str(filter, arg); + + case FILTER_ARG_VALUE: + return val_to_str(filter, arg); + + case FILTER_ARG_FIELD: + return field_to_str(filter, arg); + + case FILTER_ARG_EXP: + return exp_to_str(filter, arg); + + default: + /* ?? */ + return NULL; + } + +} + +/** + * pevent_filter_make_string - return a string showing the filter + * @filter: filter struct with filter information + * @event_id: the event id to return the filter string with + * + * Returns a string that displays the filter contents. + * This string must be freed with free(str). + * NULL is returned if no filter is found. + */ +char * +pevent_filter_make_string(struct event_filter *filter, int event_id) +{ + struct filter_type *filter_type; + + if (!filter->filters) + return NULL; + + filter_type = find_filter_type(filter, event_id); + + if (!filter_type) + return NULL; + + return arg_to_str(filter, filter_type->filter); +} + +/** + * pevent_filter_compare - compare two filters and return if they are the same + * @filter1: Filter to compare with @filter2 + * @filter2: Filter to compare with @filter1 + * + * Returns: + * 1 if the two filters hold the same content. + * 0 if they do not. + */ +int pevent_filter_compare(struct event_filter *filter1, struct event_filter *filter2) +{ + struct filter_type *filter_type1; + struct filter_type *filter_type2; + char *str1, *str2; + int result; + int i; + + /* Do the easy checks first */ + if (filter1->filters != filter2->filters) + return 0; + if (!filter1->filters && !filter2->filters) + return 1; + + /* + * Now take a look at each of the events to see if they have the same + * filters to them. + */ + for (i = 0; i < filter1->filters; i++) { + filter_type1 = &filter1->event_filters[i]; + filter_type2 = find_filter_type(filter2, filter_type1->event_id); + if (!filter_type2) + break; + if (filter_type1->filter->type != filter_type2->filter->type) + break; + switch (filter_type1->filter->type) { + case FILTER_TRIVIAL_FALSE: + case FILTER_TRIVIAL_TRUE: + /* trivial types just need the type compared */ + continue; + default: + break; + } + /* The best way to compare complex filters is with strings */ + str1 = arg_to_str(filter1, filter_type1->filter); + str2 = arg_to_str(filter2, filter_type2->filter); + if (str1 && str2) + result = strcmp(str1, str2) != 0; + else + /* bail out if allocation fails */ + result = 1; + + free(str1); + free(str2); + if (result) + break; + } + + if (i < filter1->filters) + return 0; + return 1; +} + diff --git a/tools/lib/traceevent/parse-utils.c b/tools/lib/traceevent/parse-utils.c new file mode 100644 index 00000000..bba701cf --- /dev/null +++ b/tools/lib/traceevent/parse-utils.c @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2010 Red Hat Inc, Steven Rostedt + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#include +#include +#include +#include +#include + +#define __weak __attribute__((weak)) + +void __vdie(const char *fmt, va_list ap) +{ + int ret = errno; + + if (errno) + perror("trace-cmd"); + else + ret = -1; + + fprintf(stderr, " "); + vfprintf(stderr, fmt, ap); + + fprintf(stderr, "\n"); + exit(ret); +} + +void __die(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + __vdie(fmt, ap); + va_end(ap); +} + +void __weak die(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + __vdie(fmt, ap); + va_end(ap); +} + +void __vwarning(const char *fmt, va_list ap) +{ + if (errno) + perror("trace-cmd"); + errno = 0; + + fprintf(stderr, " "); + vfprintf(stderr, fmt, ap); + + fprintf(stderr, "\n"); +} + +void __warning(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + __vwarning(fmt, ap); + va_end(ap); +} + +void __weak warning(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + __vwarning(fmt, ap); + va_end(ap); +} + +void __vpr_stat(const char *fmt, va_list ap) +{ + vprintf(fmt, ap); + printf("\n"); +} + +void __pr_stat(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + __vpr_stat(fmt, ap); + va_end(ap); +} + +void __weak vpr_stat(const char *fmt, va_list ap) +{ + __vpr_stat(fmt, ap); +} + +void __weak pr_stat(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + __vpr_stat(fmt, ap); + va_end(ap); +} + +void __weak *malloc_or_die(unsigned int size) +{ + void *data; + + data = malloc(size); + if (!data) + die("malloc"); + return data; +} diff --git a/tools/lib/traceevent/trace-seq.c b/tools/lib/traceevent/trace-seq.c new file mode 100644 index 00000000..a57db805 --- /dev/null +++ b/tools/lib/traceevent/trace-seq.c @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2009 Red Hat Inc, Steven Rostedt + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#include +#include +#include +#include + +#include "event-parse.h" +#include "event-utils.h" + +/* + * The TRACE_SEQ_POISON is to catch the use of using + * a trace_seq structure after it was destroyed. + */ +#define TRACE_SEQ_POISON ((void *)0xdeadbeef) +#define TRACE_SEQ_CHECK(s) \ +do { \ + if ((s)->buffer == TRACE_SEQ_POISON) \ + die("Usage of trace_seq after it was destroyed"); \ +} while (0) + +/** + * trace_seq_init - initialize the trace_seq structure + * @s: a pointer to the trace_seq structure to initialize + */ +void trace_seq_init(struct trace_seq *s) +{ + s->len = 0; + s->readpos = 0; + s->buffer_size = TRACE_SEQ_BUF_SIZE; + s->buffer = malloc_or_die(s->buffer_size); +} + +/** + * trace_seq_destroy - free up memory of a trace_seq + * @s: a pointer to the trace_seq to free the buffer + * + * Only frees the buffer, not the trace_seq struct itself. + */ +void trace_seq_destroy(struct trace_seq *s) +{ + if (!s) + return; + TRACE_SEQ_CHECK(s); + free(s->buffer); + s->buffer = TRACE_SEQ_POISON; +} + +static void expand_buffer(struct trace_seq *s) +{ + s->buffer_size += TRACE_SEQ_BUF_SIZE; + s->buffer = realloc(s->buffer, s->buffer_size); + if (!s->buffer) + die("Can't allocate trace_seq buffer memory"); +} + +/** + * trace_seq_printf - sequence printing of trace information + * @s: trace sequence descriptor + * @fmt: printf format string + * + * It returns 0 if the trace oversizes the buffer's free + * space, 1 otherwise. + * + * The tracer may use either sequence operations or its own + * copy to user routines. To simplify formating of a trace + * trace_seq_printf is used to store strings into a special + * buffer (@s). Then the output may be either used by + * the sequencer or pulled into another buffer. + */ +int +trace_seq_printf(struct trace_seq *s, const char *fmt, ...) +{ + va_list ap; + int len; + int ret; + + TRACE_SEQ_CHECK(s); + + try_again: + len = (s->buffer_size - 1) - s->len; + + va_start(ap, fmt); + ret = vsnprintf(s->buffer + s->len, len, fmt, ap); + va_end(ap); + + if (ret >= len) { + expand_buffer(s); + goto try_again; + } + + s->len += ret; + + return 1; +} + +/** + * trace_seq_vprintf - sequence printing of trace information + * @s: trace sequence descriptor + * @fmt: printf format string + * + * The tracer may use either sequence operations or its own + * copy to user routines. To simplify formating of a trace + * trace_seq_printf is used to store strings into a special + * buffer (@s). Then the output may be either used by + * the sequencer or pulled into another buffer. + */ +int +trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args) +{ + int len; + int ret; + + TRACE_SEQ_CHECK(s); + + try_again: + len = (s->buffer_size - 1) - s->len; + + ret = vsnprintf(s->buffer + s->len, len, fmt, args); + + if (ret >= len) { + expand_buffer(s); + goto try_again; + } + + s->len += ret; + + return len; +} + +/** + * trace_seq_puts - trace sequence printing of simple string + * @s: trace sequence descriptor + * @str: simple string to record + * + * The tracer may use either the sequence operations or its own + * copy to user routines. This function records a simple string + * into a special buffer (@s) for later retrieval by a sequencer + * or other mechanism. + */ +int trace_seq_puts(struct trace_seq *s, const char *str) +{ + int len; + + TRACE_SEQ_CHECK(s); + + len = strlen(str); + + while (len > ((s->buffer_size - 1) - s->len)) + expand_buffer(s); + + memcpy(s->buffer + s->len, str, len); + s->len += len; + + return len; +} + +int trace_seq_putc(struct trace_seq *s, unsigned char c) +{ + TRACE_SEQ_CHECK(s); + + while (s->len >= (s->buffer_size - 1)) + expand_buffer(s); + + s->buffer[s->len++] = c; + + return 1; +} + +void trace_seq_terminate(struct trace_seq *s) +{ + TRACE_SEQ_CHECK(s); + + /* There's always one character left on the buffer */ + s->buffer[s->len] = 0; +} + +int trace_seq_do_printf(struct trace_seq *s) +{ + TRACE_SEQ_CHECK(s); + return printf("%.*s", s->len, s->buffer); +} diff --git a/tools/net/Makefile b/tools/net/Makefile new file mode 100644 index 00000000..b4444d53 --- /dev/null +++ b/tools/net/Makefile @@ -0,0 +1,15 @@ +prefix = /usr + +CC = gcc + +all : bpf_jit_disasm + +bpf_jit_disasm : CFLAGS = -Wall -O2 +bpf_jit_disasm : LDLIBS = -lopcodes -lbfd -ldl +bpf_jit_disasm : bpf_jit_disasm.o + +clean : + rm -rf *.o bpf_jit_disasm + +install : + install bpf_jit_disasm $(prefix)/bin/bpf_jit_disasm diff --git a/tools/net/bpf_jit_disasm.c b/tools/net/bpf_jit_disasm.c new file mode 100644 index 00000000..cfe0cdcd --- /dev/null +++ b/tools/net/bpf_jit_disasm.c @@ -0,0 +1,199 @@ +/* + * Minimal BPF JIT image disassembler + * + * Disassembles BPF JIT compiler emitted opcodes back to asm insn's for + * debugging or verification purposes. + * + * To get the disassembly of the JIT code, do the following: + * + * 1) `echo 2 > /proc/sys/net/core/bpf_jit_enable` + * 2) Load a BPF filter (e.g. `tcpdump -p -n -s 0 -i eth1 host 192.168.20.0/24`) + * 3) Run e.g. `bpf_jit_disasm -o` to read out the last JIT code + * + * Copyright 2013 Daniel Borkmann + * Licensed under the GNU General Public License, version 2.0 (GPLv2) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void get_exec_path(char *tpath, size_t size) +{ + char *path; + ssize_t len; + + snprintf(tpath, size, "/proc/%d/exe", (int) getpid()); + tpath[size - 1] = 0; + + path = strdup(tpath); + assert(path); + + len = readlink(path, tpath, size); + tpath[len] = 0; + + free(path); +} + +static void get_asm_insns(uint8_t *image, size_t len, unsigned long base, + int opcodes) +{ + int count, i, pc = 0; + char tpath[256]; + struct disassemble_info info; + disassembler_ftype disassemble; + bfd *bfdf; + + memset(tpath, 0, sizeof(tpath)); + get_exec_path(tpath, sizeof(tpath)); + + bfdf = bfd_openr(tpath, NULL); + assert(bfdf); + assert(bfd_check_format(bfdf, bfd_object)); + + init_disassemble_info(&info, stdout, (fprintf_ftype) fprintf); + info.arch = bfd_get_arch(bfdf); + info.mach = bfd_get_mach(bfdf); + info.buffer = image; + info.buffer_length = len; + + disassemble_init_for_target(&info); + + disassemble = disassembler(bfdf); + assert(disassemble); + + do { + printf("%4x:\t", pc); + + count = disassemble(pc, &info); + + if (opcodes) { + printf("\n\t"); + for (i = 0; i < count; ++i) + printf("%02x ", (uint8_t) image[pc + i]); + } + printf("\n"); + + pc += count; + } while(count > 0 && pc < len); + + bfd_close(bfdf); +} + +static char *get_klog_buff(int *klen) +{ + int ret, len = klogctl(10, NULL, 0); + char *buff = malloc(len); + + assert(buff && klen); + ret = klogctl(3, buff, len); + assert(ret >= 0); + *klen = ret; + + return buff; +} + +static void put_klog_buff(char *buff) +{ + free(buff); +} + +static int get_last_jit_image(char *haystack, size_t hlen, + uint8_t *image, size_t ilen, + unsigned long *base) +{ + char *ptr, *pptr, *tmp; + off_t off = 0; + int ret, flen, proglen, pass, ulen = 0; + regmatch_t pmatch[1]; + regex_t regex; + + if (hlen == 0) + return 0; + + ret = regcomp(®ex, "flen=[[:alnum:]]+ proglen=[[:digit:]]+ " + "pass=[[:digit:]]+ image=[[:xdigit:]]+", REG_EXTENDED); + assert(ret == 0); + + ptr = haystack; + while (1) { + ret = regexec(®ex, ptr, 1, pmatch, 0); + if (ret == 0) { + ptr += pmatch[0].rm_eo; + off += pmatch[0].rm_eo; + assert(off < hlen); + } else + break; + } + + ptr = haystack + off - (pmatch[0].rm_eo - pmatch[0].rm_so); + ret = sscanf(ptr, "flen=%d proglen=%d pass=%d image=%lx", + &flen, &proglen, &pass, base); + if (ret != 4) + return 0; + + tmp = ptr = haystack + off; + while ((ptr = strtok(tmp, "\n")) != NULL && ulen < ilen) { + tmp = NULL; + if (!strstr(ptr, "JIT code")) + continue; + pptr = ptr; + while ((ptr = strstr(pptr, ":"))) + pptr = ptr + 1; + ptr = pptr; + do { + image[ulen++] = (uint8_t) strtoul(pptr, &pptr, 16); + if (ptr == pptr || ulen >= ilen) { + ulen--; + break; + } + ptr = pptr; + } while (1); + } + + assert(ulen == proglen); + printf("%d bytes emitted from JIT compiler (pass:%d, flen:%d)\n", + proglen, pass, flen); + printf("%lx + :\n", *base); + + regfree(®ex); + return ulen; +} + +int main(int argc, char **argv) +{ + int len, klen, opcodes = 0; + char *kbuff; + unsigned long base; + uint8_t image[4096]; + + if (argc > 1) { + if (!strncmp("-o", argv[argc - 1], 2)) { + opcodes = 1; + } else { + printf("usage: bpf_jit_disasm [-o: show opcodes]\n"); + exit(0); + } + } + + bfd_init(); + memset(image, 0, sizeof(image)); + + kbuff = get_klog_buff(&klen); + + len = get_last_jit_image(kbuff, klen, image, sizeof(image), &base); + if (len > 0 && base > 0) + get_asm_insns(image, len, base, opcodes); + + put_klog_buff(kbuff); + + return 0; +} diff --git a/tools/nfsd/inject_fault.sh b/tools/nfsd/inject_fault.sh new file mode 100755 index 00000000..06a399ac --- /dev/null +++ b/tools/nfsd/inject_fault.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# +# Copyright (c) 2011 Bryan Schumaker +# +# Script for easier NFSD fault injection + +# Check that debugfs has been mounted +DEBUGFS=`cat /proc/mounts | grep debugfs` +if [ "$DEBUGFS" == "" ]; then + echo "debugfs does not appear to be mounted!" + echo "Please mount debugfs and try again" + exit 1 +fi + +# Check that the fault injection directory exists +DEBUGDIR=`echo $DEBUGFS | awk '{print $2}'`/nfsd +if [ ! -d "$DEBUGDIR" ]; then + echo "$DEBUGDIR does not exist" + echo "Check that your .config selects CONFIG_NFSD_FAULT_INJECTION" + exit 1 +fi + +function help() +{ + echo "Usage $0 injection_type [count]" + echo "" + echo "Injection types are:" + ls $DEBUGDIR + exit 1 +} + +if [ $# == 0 ]; then + help +elif [ ! -f $DEBUGDIR/$1 ]; then + help +elif [ $# != 2 ]; then + COUNT=0 +else + COUNT=$2 +fi + +BEFORE=`mktemp` +AFTER=`mktemp` +dmesg > $BEFORE +echo $COUNT > $DEBUGDIR/$1 +dmesg > $AFTER +# Capture lines that only exist in the $AFTER file +diff $BEFORE $AFTER | grep ">" +rm -f $BEFORE $AFTER diff --git a/tools/perf/.gitignore b/tools/perf/.gitignore new file mode 100644 index 00000000..8f8fbc22 --- /dev/null +++ b/tools/perf/.gitignore @@ -0,0 +1,25 @@ +PERF-CFLAGS +PERF-GUI-VARS +PERF-VERSION-FILE +perf +perf-help +perf-record +perf-report +perf-stat +perf-top +perf*.1 +perf*.xml +perf*.html +common-cmds.h +perf.data +perf.data.old +perf-archive +tags +TAGS +cscope* +config.mak +config.mak.autogen +*-bison.* +*-flex.* +*.pyc +*.pyo diff --git a/tools/perf/CREDITS b/tools/perf/CREDITS new file mode 100644 index 00000000..c2ddcb3a --- /dev/null +++ b/tools/perf/CREDITS @@ -0,0 +1,30 @@ +Most of the infrastructure that 'perf' uses here has been reused +from the Git project, as of version: + + 66996ec: Sync with 1.6.2.4 + +Here is an (incomplete!) list of main contributors to those files +in util/* and elsewhere: + + Alex Riesen + Christian Couder + Dmitry Potapov + Jeff King + Johannes Schindelin + Johannes Sixt + Junio C Hamano + Linus Torvalds + Matthias Kestenholz + Michal Ostrowski + Miklos Vajna + Petr Baudis + Pierre Habouzit + René Scharfe + Samuel Tardieu + Shawn O. Pearce + Steffen Prohaska + Steve Haslam + +Thanks guys! + +The full history of the files can be found in the upstream Git commits. diff --git a/tools/perf/Documentation/Makefile b/tools/perf/Documentation/Makefile new file mode 100644 index 00000000..eb30044a --- /dev/null +++ b/tools/perf/Documentation/Makefile @@ -0,0 +1,352 @@ +include ../config/utilities.mak + +OUTPUT := ./ +ifeq ("$(origin O)", "command line") + ifneq ($(O),) + OUTPUT := $(O)/ + endif +endif + +MAN1_TXT= \ + $(filter-out $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \ + $(wildcard perf-*.txt)) \ + perf.txt +MAN5_TXT= +MAN7_TXT= + +MAN_TXT = $(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT) +_MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT)) +_MAN_HTML=$(patsubst %.txt,%.html,$(MAN_TXT)) + +MAN_XML=$(addprefix $(OUTPUT),$(_MAN_XML)) +MAN_HTML=$(addprefix $(OUTPUT),$(_MAN_HTML)) + +ARTICLES = +# with their own formatting rules. +SP_ARTICLES = +API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt))) +SP_ARTICLES += $(API_DOCS) +SP_ARTICLES += technical/api-index + +_DOC_HTML = $(_MAN_HTML) +_DOC_HTML+=$(patsubst %,%.html,$(ARTICLES) $(SP_ARTICLES)) +DOC_HTML=$(addprefix $(OUTPUT),$(_DOC_HTML)) + +_DOC_MAN1=$(patsubst %.txt,%.1,$(MAN1_TXT)) +_DOC_MAN5=$(patsubst %.txt,%.5,$(MAN5_TXT)) +_DOC_MAN7=$(patsubst %.txt,%.7,$(MAN7_TXT)) + +DOC_MAN1=$(addprefix $(OUTPUT),$(_DOC_MAN1)) +DOC_MAN5=$(addprefix $(OUTPUT),$(_DOC_MAN5)) +DOC_MAN7=$(addprefix $(OUTPUT),$(_DOC_MAN7)) + +# Make the path relative to DESTDIR, not prefix +ifndef DESTDIR +prefix?=$(HOME) +endif +bindir?=$(prefix)/bin +htmldir?=$(prefix)/share/doc/perf-doc +pdfdir?=$(prefix)/share/doc/perf-doc +mandir?=$(prefix)/share/man +man1dir=$(mandir)/man1 +man5dir=$(mandir)/man5 +man7dir=$(mandir)/man7 + +ASCIIDOC=asciidoc +ASCIIDOC_EXTRA = --unsafe +MANPAGE_XSL = manpage-normal.xsl +XMLTO_EXTRA = +INSTALL?=install +RM ?= rm -f +DOC_REF = origin/man +HTML_REF = origin/html + +infodir?=$(prefix)/share/info +MAKEINFO=makeinfo +INSTALL_INFO=install-info +DOCBOOK2X_TEXI=docbook2x-texi +DBLATEX=dblatex +XMLTO=xmlto +ifndef PERL_PATH + PERL_PATH = /usr/bin/perl +endif + +-include ../config.mak.autogen +-include ../config.mak + +_tmp_tool_path := $(call get-executable,$(ASCIIDOC)) +ifeq ($(_tmp_tool_path),) + missing_tools = $(ASCIIDOC) +endif + +_tmp_tool_path := $(call get-executable,$(XMLTO)) +ifeq ($(_tmp_tool_path),) + missing_tools += $(XMLTO) +endif + +# +# For asciidoc ... +# -7.1.2, no extra settings are needed. +# 8.0-, set ASCIIDOC8. +# + +# +# For docbook-xsl ... +# -1.68.1, set ASCIIDOC_NO_ROFF? (based on changelog from 1.73.0) +# 1.69.0, no extra settings are needed? +# 1.69.1-1.71.0, set DOCBOOK_SUPPRESS_SP? +# 1.71.1, no extra settings are needed? +# 1.72.0, set DOCBOOK_XSL_172. +# 1.73.0-, set ASCIIDOC_NO_ROFF +# + +# +# If you had been using DOCBOOK_XSL_172 in an attempt to get rid +# of 'the ".ft C" problem' in your generated manpages, and you +# instead ended up with weird characters around callouts, try +# using ASCIIDOC_NO_ROFF instead (it works fine with ASCIIDOC8). +# + +ifdef ASCIIDOC8 +ASCIIDOC_EXTRA += -a asciidoc7compatible +endif +ifdef DOCBOOK_XSL_172 +ASCIIDOC_EXTRA += -a perf-asciidoc-no-roff +MANPAGE_XSL = manpage-1.72.xsl +else + ifdef ASCIIDOC_NO_ROFF + # docbook-xsl after 1.72 needs the regular XSL, but will not + # pass-thru raw roff codes from asciidoc.conf, so turn them off. + ASCIIDOC_EXTRA += -a perf-asciidoc-no-roff + endif +endif +ifdef MAN_BOLD_LITERAL +XMLTO_EXTRA += -m manpage-bold-literal.xsl +endif +ifdef DOCBOOK_SUPPRESS_SP +XMLTO_EXTRA += -m manpage-suppress-sp.xsl +endif + +SHELL_PATH ?= $(SHELL) +# Shell quote; +SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) + +# +# Please note that there is a minor bug in asciidoc. +# The version after 6.0.3 _will_ include the patch found here: +# http://marc.theaimsgroup.com/?l=perf&m=111558757202243&w=2 +# +# Until that version is released you may have to apply the patch +# yourself - yes, all 6 characters of it! +# + +QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir +QUIET_SUBDIR1 = + +ifneq ($(findstring $(MAKEFLAGS),w),w) +PRINT_DIR = --no-print-directory +else # "make -w" +NO_SUBDIR = : +endif + +ifneq ($(findstring $(MAKEFLAGS),s),s) +ifndef V + QUIET_ASCIIDOC = @echo ' ' ASCIIDOC $@; + QUIET_XMLTO = @echo ' ' XMLTO $@; + QUIET_DB2TEXI = @echo ' ' DB2TEXI $@; + QUIET_MAKEINFO = @echo ' ' MAKEINFO $@; + QUIET_DBLATEX = @echo ' ' DBLATEX $@; + QUIET_XSLTPROC = @echo ' ' XSLTPROC $@; + QUIET_GEN = @echo ' ' GEN $@; + QUIET_STDERR = 2> /dev/null + QUIET_SUBDIR0 = +@subdir= + QUIET_SUBDIR1 = ;$(NO_SUBDIR) echo ' ' SUBDIR $$subdir; \ + $(MAKE) $(PRINT_DIR) -C $$subdir + export V +endif +endif + +all: html man + +html: $(DOC_HTML) + +$(DOC_HTML) $(DOC_MAN1) $(DOC_MAN5) $(DOC_MAN7): asciidoc.conf + +man: man1 man5 man7 +man1: $(DOC_MAN1) +man5: $(DOC_MAN5) +man7: $(DOC_MAN7) + +info: $(OUTPUT)perf.info $(OUTPUT)perfman.info + +pdf: $(OUTPUT)user-manual.pdf + +install: install-man + +check-man-tools: +ifdef missing_tools + $(error "You need to install $(missing_tools) for man pages") +endif + +do-install-man: man + $(INSTALL) -d -m 755 $(DESTDIR)$(man1dir) +# $(INSTALL) -d -m 755 $(DESTDIR)$(man5dir) +# $(INSTALL) -d -m 755 $(DESTDIR)$(man7dir) + $(INSTALL) -m 644 $(DOC_MAN1) $(DESTDIR)$(man1dir) +# $(INSTALL) -m 644 $(DOC_MAN5) $(DESTDIR)$(man5dir) +# $(INSTALL) -m 644 $(DOC_MAN7) $(DESTDIR)$(man7dir) + +install-man: check-man-tools man + +try-install-man: +ifdef missing_tools + $(warning Please install $(missing_tools) to have the man pages installed) +else + $(MAKE) do-install-man +endif + +install-info: info + $(INSTALL) -d -m 755 $(DESTDIR)$(infodir) + $(INSTALL) -m 644 $(OUTPUT)perf.info $(OUTPUT)perfman.info $(DESTDIR)$(infodir) + if test -r $(DESTDIR)$(infodir)/dir; then \ + $(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) perf.info ;\ + $(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) perfman.info ;\ + else \ + echo "No directory found in $(DESTDIR)$(infodir)" >&2 ; \ + fi + +install-pdf: pdf + $(INSTALL) -d -m 755 $(DESTDIR)$(pdfdir) + $(INSTALL) -m 644 $(OUTPUT)user-manual.pdf $(DESTDIR)$(pdfdir) + +#install-html: html +# '$(SHELL_PATH_SQ)' ./install-webdoc.sh $(DESTDIR)$(htmldir) + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(MAKECMDGOALS),tags) +$(OUTPUT)PERF-VERSION-FILE: .FORCE-PERF-VERSION-FILE + $(QUIET_SUBDIR0)../ $(QUIET_SUBDIR1) $(OUTPUT)PERF-VERSION-FILE + +-include $(OUTPUT)PERF-VERSION-FILE +endif +endif + +# +# Determine "include::" file references in asciidoc files. +# +$(OUTPUT)doc.dep : $(wildcard *.txt) build-docdep.perl + $(QUIET_GEN)$(RM) $@+ $@ && \ + $(PERL_PATH) ./build-docdep.perl >$@+ $(QUIET_STDERR) && \ + mv $@+ $@ + +-include $(OUPTUT)doc.dep + +_cmds_txt = cmds-ancillaryinterrogators.txt \ + cmds-ancillarymanipulators.txt \ + cmds-mainporcelain.txt \ + cmds-plumbinginterrogators.txt \ + cmds-plumbingmanipulators.txt \ + cmds-synchingrepositories.txt \ + cmds-synchelpers.txt \ + cmds-purehelpers.txt \ + cmds-foreignscminterface.txt +cmds_txt=$(addprefix $(OUTPUT),$(_cmds_txt)) + +$(cmds_txt): $(OUTPUT)cmd-list.made + +$(OUTPUT)cmd-list.made: cmd-list.perl ../command-list.txt $(MAN1_TXT) + $(QUIET_GEN)$(RM) $@ && \ + $(PERL_PATH) ./cmd-list.perl ../command-list.txt $(QUIET_STDERR) && \ + date >$@ + +clean: + $(RM) $(MAN_XML) $(addsuffix +,$(MAN_XML)) + $(RM) $(MAN_HTML) $(addsuffix +,$(MAN_HTML)) + $(RM) $(DOC_HTML) $(DOC_MAN1) $(DOC_MAN5) $(DOC_MAN7) + $(RM) $(OUTPUT)*.texi $(OUTPUT)*.texi+ $(OUTPUT)*.texi++ + $(RM) $(OUTPUT)perf.info $(OUTPUT)perfman.info + $(RM) $(OUTPUT)howto-index.txt $(OUTPUT)howto/*.html $(OUTPUT)doc.dep + $(RM) $(OUTPUT)technical/api-*.html $(OUTPUT)technical/api-index.txt + $(RM) $(cmds_txt) $(OUTPUT)*.made + +$(MAN_HTML): $(OUTPUT)%.html : %.txt + $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \ + $(ASCIIDOC) -b xhtml11 -d manpage -f asciidoc.conf \ + $(ASCIIDOC_EXTRA) -aperf_version=$(PERF_VERSION) -o $@+ $< && \ + mv $@+ $@ + +$(OUTPUT)%.1 $(OUTPUT)%.5 $(OUTPUT)%.7 : $(OUTPUT)%.xml + $(QUIET_XMLTO)$(RM) $@ && \ + $(XMLTO) -o $(OUTPUT) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $< + +$(OUTPUT)%.xml : %.txt + $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \ + $(ASCIIDOC) -b docbook -d manpage -f asciidoc.conf \ + $(ASCIIDOC_EXTRA) -aperf_version=$(PERF_VERSION) -o $@+ $< && \ + mv $@+ $@ + +XSLT = docbook.xsl +XSLTOPTS = --xinclude --stringparam html.stylesheet docbook-xsl.css + +$(OUTPUT)user-manual.html: $(OUTPUT)user-manual.xml + $(QUIET_XSLTPROC)xsltproc $(XSLTOPTS) -o $@ $(XSLT) $< + +$(OUTPUT)perf.info: $(OUTPUT)user-manual.texi + $(QUIET_MAKEINFO)$(MAKEINFO) --no-split -o $@ $(OUTPUT)user-manual.texi + +$(OUTPUT)user-manual.texi: $(OUTPUT)user-manual.xml + $(QUIET_DB2TEXI)$(RM) $@+ $@ && \ + $(DOCBOOK2X_TEXI) $(OUTPUT)user-manual.xml --encoding=UTF-8 --to-stdout >$@++ && \ + $(PERL_PATH) fix-texi.perl <$@++ >$@+ && \ + rm $@++ && \ + mv $@+ $@ + +$(OUTPUT)user-manual.pdf: $(OUTPUT)user-manual.xml + $(QUIET_DBLATEX)$(RM) $@+ $@ && \ + $(DBLATEX) -o $@+ -p /etc/asciidoc/dblatex/asciidoc-dblatex.xsl -s /etc/asciidoc/dblatex/asciidoc-dblatex.sty $< && \ + mv $@+ $@ + +$(OUTPUT)perfman.texi: $(MAN_XML) cat-texi.perl + $(QUIET_DB2TEXI)$(RM) $@+ $@ && \ + ($(foreach xml,$(MAN_XML),$(DOCBOOK2X_TEXI) --encoding=UTF-8 \ + --to-stdout $(xml) &&) true) > $@++ && \ + $(PERL_PATH) cat-texi.perl $@ <$@++ >$@+ && \ + rm $@++ && \ + mv $@+ $@ + +$(OUTPUT)perfman.info: $(OUTPUT)perfman.texi + $(QUIET_MAKEINFO)$(MAKEINFO) --no-split --no-validate $*.texi + +$(patsubst %.txt,%.texi,$(MAN_TXT)): %.texi : %.xml + $(QUIET_DB2TEXI)$(RM) $@+ $@ && \ + $(DOCBOOK2X_TEXI) --to-stdout $*.xml >$@+ && \ + mv $@+ $@ + +howto-index.txt: howto-index.sh $(wildcard howto/*.txt) + $(QUIET_GEN)$(RM) $@+ $@ && \ + '$(SHELL_PATH_SQ)' ./howto-index.sh $(wildcard howto/*.txt) >$@+ && \ + mv $@+ $@ + +$(patsubst %,%.html,$(ARTICLES)) : %.html : %.txt + $(QUIET_ASCIIDOC)$(ASCIIDOC) -b xhtml11 $*.txt + +WEBDOC_DEST = /pub/software/tools/perf/docs + +$(patsubst %.txt,%.html,$(wildcard howto/*.txt)): %.html : %.txt + $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \ + sed -e '1,/^$$/d' $< | $(ASCIIDOC) -b xhtml11 - >$@+ && \ + mv $@+ $@ + +# UNIMPLEMENTED +#install-webdoc : html +# '$(SHELL_PATH_SQ)' ./install-webdoc.sh $(WEBDOC_DEST) + +# quick-install: quick-install-man + +# quick-install-man: +# '$(SHELL_PATH_SQ)' ./install-doc-quick.sh $(DOC_REF) $(DESTDIR)$(mandir) + +#quick-install-html: +# '$(SHELL_PATH_SQ)' ./install-doc-quick.sh $(HTML_REF) $(DESTDIR)$(htmldir) + +.PHONY: .FORCE-PERF-VERSION-FILE diff --git a/tools/perf/Documentation/android.txt b/tools/perf/Documentation/android.txt new file mode 100644 index 00000000..8484c3a0 --- /dev/null +++ b/tools/perf/Documentation/android.txt @@ -0,0 +1,78 @@ +How to compile perf for Android +========================================= + +I. Set the Android NDK environment +------------------------------------------------ + +(a). Use the Android NDK +------------------------------------------------ +1. You need to download and install the Android Native Development Kit (NDK). +Set the NDK variable to point to the path where you installed the NDK: + export NDK=/path/to/android-ndk + +2. Set cross-compiling environment variables for NDK toolchain and sysroot. +For arm: + export NDK_TOOLCHAIN=${NDK}/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi- + export NDK_SYSROOT=${NDK}/platforms/android-9/arch-arm +For x86: + export NDK_TOOLCHAIN=${NDK}/toolchains/x86-4.6/prebuilt/linux-x86/bin/i686-linux-android- + export NDK_SYSROOT=${NDK}/platforms/android-9/arch-x86 + +This method is not working for Android NDK versions up to Revision 8b. +perf uses some bionic enhancements that are not included in these NDK versions. +You can use method (b) described below instead. + +(b). Use the Android source tree +----------------------------------------------- +1. Download the master branch of the Android source tree. +Set the environment for the target you want using: + source build/envsetup.sh + lunch + +2. Build your own NDK sysroot to contain latest bionic changes and set the +NDK sysroot environment variable. + cd ${ANDROID_BUILD_TOP}/ndk +For arm: + ./build/tools/build-ndk-sysroot.sh --abi=arm + export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-arm +For x86: + ./build/tools/build-ndk-sysroot.sh --abi=x86 + export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-x86 + +3. Set the NDK toolchain environment variable. +For arm: + export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/arm-linux-androideabi- +For x86: + export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/i686-linux-android- + +II. Compile perf for Android +------------------------------------------------ +You need to run make with the NDK toolchain and sysroot defined above: +For arm: + make ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT}" +For x86: + make ARCH=x86 CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT}" + +III. Install perf +----------------------------------------------- +You need to connect to your Android device/emulator using adb. +Install perf using: + adb push perf /data/perf + +If you also want to use perf-archive you need busybox tools for Android. +For installing perf-archive, you first need to replace #!/bin/bash with #!/system/bin/sh: + sed 's/#!\/bin\/bash/#!\/system\/bin\/sh/g' perf-archive >> /tmp/perf-archive + chmod +x /tmp/perf-archive + adb push /tmp/perf-archive /data/perf-archive + +IV. Environment settings for running perf +------------------------------------------------ +Some perf features need environment variables to run properly. +You need to set these before running perf on the target: + adb shell + # PERF_PAGER=cat + +IV. Run perf +------------------------------------------------ +Run perf on your device/emulator to which you previously connected using adb: + # ./data/perf diff --git a/tools/perf/Documentation/asciidoc.conf b/tools/perf/Documentation/asciidoc.conf new file mode 100644 index 00000000..356b23a4 --- /dev/null +++ b/tools/perf/Documentation/asciidoc.conf @@ -0,0 +1,91 @@ +## linkperf: macro +# +# Usage: linkperf:command[manpage-section] +# +# Note, {0} is the manpage section, while {target} is the command. +# +# Show PERF link as: (
); if section is defined, else just show +# the command. + +[macros] +(?su)[\\]?(?Plinkperf):(?P\S*?)\[(?P.*?)\]= + +[attributes] +asterisk=* +plus=+ +caret=^ +startsb=[ +endsb=] +tilde=~ + +ifdef::backend-docbook[] +[linkperf-inlinemacro] +{0%{target}} +{0#} +{0#{target}{0}} +{0#} +endif::backend-docbook[] + +ifdef::backend-docbook[] +ifndef::perf-asciidoc-no-roff[] +# "unbreak" docbook-xsl v1.68 for manpages. v1.69 works with or without this. +# v1.72 breaks with this because it replaces dots not in roff requests. +[listingblock] +{title} + +ifdef::doctype-manpage[] + .ft C +endif::doctype-manpage[] +| +ifdef::doctype-manpage[] + .ft +endif::doctype-manpage[] + +{title#} +endif::perf-asciidoc-no-roff[] + +ifdef::perf-asciidoc-no-roff[] +ifdef::doctype-manpage[] +# The following two small workarounds insert a simple paragraph after screen +[listingblock] +{title} + +| + +{title#} + +[verseblock] +{title} +{title%} +{title#} +| + +{title#} +{title%} +endif::doctype-manpage[] +endif::perf-asciidoc-no-roff[] +endif::backend-docbook[] + +ifdef::doctype-manpage[] +ifdef::backend-docbook[] +[header] +template::[header-declarations] + + +{mantitle} +{manvolnum} +perf +{perf_version} +perf Manual + + + {manname} + {manpurpose} + +endif::backend-docbook[] +endif::doctype-manpage[] + +ifdef::backend-xhtml11[] +[linkperf-inlinemacro] +{target}{0?({0})} +endif::backend-xhtml11[] diff --git a/tools/perf/Documentation/examples.txt b/tools/perf/Documentation/examples.txt new file mode 100644 index 00000000..77f95276 --- /dev/null +++ b/tools/perf/Documentation/examples.txt @@ -0,0 +1,225 @@ + + ------------------------------ + ****** perf by examples ****** + ------------------------------ + +[ From an e-mail by Ingo Molnar, http://lkml.org/lkml/2009/8/4/346 ] + + +First, discovery/enumeration of available counters can be done via +'perf list': + +titan:~> perf list + [...] + kmem:kmalloc [Tracepoint event] + kmem:kmem_cache_alloc [Tracepoint event] + kmem:kmalloc_node [Tracepoint event] + kmem:kmem_cache_alloc_node [Tracepoint event] + kmem:kfree [Tracepoint event] + kmem:kmem_cache_free [Tracepoint event] + kmem:mm_page_free [Tracepoint event] + kmem:mm_page_free_batched [Tracepoint event] + kmem:mm_page_alloc [Tracepoint event] + kmem:mm_page_alloc_zone_locked [Tracepoint event] + kmem:mm_page_pcpu_drain [Tracepoint event] + kmem:mm_page_alloc_extfrag [Tracepoint event] + +Then any (or all) of the above event sources can be activated and +measured. For example the page alloc/free properties of a 'hackbench +run' are: + + titan:~> perf stat -e kmem:mm_page_pcpu_drain -e kmem:mm_page_alloc + -e kmem:mm_page_free_batched -e kmem:mm_page_free ./hackbench 10 + Time: 0.575 + + Performance counter stats for './hackbench 10': + + 13857 kmem:mm_page_pcpu_drain + 27576 kmem:mm_page_alloc + 6025 kmem:mm_page_free_batched + 20934 kmem:mm_page_free + + 0.613972165 seconds time elapsed + +You can observe the statistical properties as well, by using the +'repeat the workload N times' feature of perf stat: + + titan:~> perf stat --repeat 5 -e kmem:mm_page_pcpu_drain -e + kmem:mm_page_alloc -e kmem:mm_page_free_batched -e + kmem:mm_page_free ./hackbench 10 + Time: 0.627 + Time: 0.644 + Time: 0.564 + Time: 0.559 + Time: 0.626 + + Performance counter stats for './hackbench 10' (5 runs): + + 12920 kmem:mm_page_pcpu_drain ( +- 3.359% ) + 25035 kmem:mm_page_alloc ( +- 3.783% ) + 6104 kmem:mm_page_free_batched ( +- 0.934% ) + 18376 kmem:mm_page_free ( +- 4.941% ) + + 0.643954516 seconds time elapsed ( +- 2.363% ) + +Furthermore, these tracepoints can be used to sample the workload as +well. For example the page allocations done by a 'git gc' can be +captured the following way: + + titan:~/git> perf record -f -e kmem:mm_page_alloc -c 1 ./git gc + Counting objects: 1148, done. + Delta compression using up to 2 threads. + Compressing objects: 100% (450/450), done. + Writing objects: 100% (1148/1148), done. + Total 1148 (delta 690), reused 1148 (delta 690) + [ perf record: Captured and wrote 0.267 MB perf.data (~11679 samples) ] + +To check which functions generated page allocations: + + titan:~/git> perf report + # Samples: 10646 + # + # Overhead Command Shared Object + # ........ ............... .......................... + # + 23.57% git-repack /lib64/libc-2.5.so + 21.81% git /lib64/libc-2.5.so + 14.59% git ./git + 11.79% git-repack ./git + 7.12% git /lib64/ld-2.5.so + 3.16% git-repack /lib64/libpthread-2.5.so + 2.09% git-repack /bin/bash + 1.97% rm /lib64/libc-2.5.so + 1.39% mv /lib64/ld-2.5.so + 1.37% mv /lib64/libc-2.5.so + 1.12% git-repack /lib64/ld-2.5.so + 0.95% rm /lib64/ld-2.5.so + 0.90% git-update-serv /lib64/libc-2.5.so + 0.73% git-update-serv /lib64/ld-2.5.so + 0.68% perf /lib64/libpthread-2.5.so + 0.64% git-repack /usr/lib64/libz.so.1.2.3 + +Or to see it on a more finegrained level: + +titan:~/git> perf report --sort comm,dso,symbol +# Samples: 10646 +# +# Overhead Command Shared Object Symbol +# ........ ............... .......................... ...... +# + 9.35% git-repack ./git [.] insert_obj_hash + 9.12% git ./git [.] insert_obj_hash + 7.31% git /lib64/libc-2.5.so [.] memcpy + 6.34% git-repack /lib64/libc-2.5.so [.] _int_malloc + 6.24% git-repack /lib64/libc-2.5.so [.] memcpy + 5.82% git-repack /lib64/libc-2.5.so [.] __GI___fork + 5.47% git /lib64/libc-2.5.so [.] _int_malloc + 2.99% git /lib64/libc-2.5.so [.] memset + +Furthermore, call-graph sampling can be done too, of page +allocations - to see precisely what kind of page allocations there +are: + + titan:~/git> perf record -f -g -e kmem:mm_page_alloc -c 1 ./git gc + Counting objects: 1148, done. + Delta compression using up to 2 threads. + Compressing objects: 100% (450/450), done. + Writing objects: 100% (1148/1148), done. + Total 1148 (delta 690), reused 1148 (delta 690) + [ perf record: Captured and wrote 0.963 MB perf.data (~42069 samples) ] + + titan:~/git> perf report -g + # Samples: 10686 + # + # Overhead Command Shared Object + # ........ ............... .......................... + # + 23.25% git-repack /lib64/libc-2.5.so + | + |--50.00%-- _int_free + | + |--37.50%-- __GI___fork + | make_child + | + |--12.50%-- ptmalloc_unlock_all2 + | make_child + | + --6.25%-- __GI_strcpy + 21.61% git /lib64/libc-2.5.so + | + |--30.00%-- __GI_read + | | + | --83.33%-- git_config_from_file + | git_config + | | + [...] + +Or you can observe the whole system's page allocations for 10 +seconds: + +titan:~/git> perf stat -a -e kmem:mm_page_pcpu_drain -e +kmem:mm_page_alloc -e kmem:mm_page_free_batched -e +kmem:mm_page_free sleep 10 + + Performance counter stats for 'sleep 10': + + 171585 kmem:mm_page_pcpu_drain + 322114 kmem:mm_page_alloc + 73623 kmem:mm_page_free_batched + 254115 kmem:mm_page_free + + 10.000591410 seconds time elapsed + +Or observe how fluctuating the page allocations are, via statistical +analysis done over ten 1-second intervals: + + titan:~/git> perf stat --repeat 10 -a -e kmem:mm_page_pcpu_drain -e + kmem:mm_page_alloc -e kmem:mm_page_free_batched -e + kmem:mm_page_free sleep 1 + + Performance counter stats for 'sleep 1' (10 runs): + + 17254 kmem:mm_page_pcpu_drain ( +- 3.709% ) + 34394 kmem:mm_page_alloc ( +- 4.617% ) + 7509 kmem:mm_page_free_batched ( +- 4.820% ) + 25653 kmem:mm_page_free ( +- 3.672% ) + + 1.058135029 seconds time elapsed ( +- 3.089% ) + +Or you can annotate the recorded 'git gc' run on a per symbol basis +and check which instructions/source-code generated page allocations: + + titan:~/git> perf annotate __GI___fork + ------------------------------------------------ + Percent | Source code & Disassembly of libc-2.5.so + ------------------------------------------------ + : + : + : Disassembly of section .plt: + : Disassembly of section .text: + : + : 00000031a2e95560 <__fork>: + [...] + 0.00 : 31a2e95602: b8 38 00 00 00 mov $0x38,%eax + 0.00 : 31a2e95607: 0f 05 syscall + 83.42 : 31a2e95609: 48 3d 00 f0 ff ff cmp $0xfffffffffffff000,%rax + 0.00 : 31a2e9560f: 0f 87 4d 01 00 00 ja 31a2e95762 <__fork+0x202> + 0.00 : 31a2e95615: 85 c0 test %eax,%eax + +( this shows that 83.42% of __GI___fork's page allocations come from + the 0x38 system call it performs. ) + +etc. etc. - a lot more is possible. I could list a dozen of +other different usecases straight away - neither of which is +possible via /proc/vmstat. + +/proc/vmstat is not in the same league really, in terms of +expressive power of system analysis and performance +analysis. + +All that the above results needed were those new tracepoints +in include/tracing/events/kmem.h. + + Ingo + + diff --git a/tools/perf/Documentation/jit-interface.txt b/tools/perf/Documentation/jit-interface.txt new file mode 100644 index 00000000..a8656f56 --- /dev/null +++ b/tools/perf/Documentation/jit-interface.txt @@ -0,0 +1,15 @@ +perf supports a simple JIT interface to resolve symbols for dynamic code generated +by a JIT. + +The JIT has to write a /tmp/perf-%d.map (%d = pid of process) file + +This is a text file. + +Each line has the following format, fields separated with spaces: + +START SIZE symbolname + +START and SIZE are hex numbers without 0x. +symbolname is the rest of the line, so it could contain special characters. + +The ownership of the file has to match the process. diff --git a/tools/perf/Documentation/manpage-1.72.xsl b/tools/perf/Documentation/manpage-1.72.xsl new file mode 100644 index 00000000..b4d315cb --- /dev/null +++ b/tools/perf/Documentation/manpage-1.72.xsl @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/tools/perf/Documentation/manpage-base.xsl b/tools/perf/Documentation/manpage-base.xsl new file mode 100644 index 00000000..a264fa61 --- /dev/null +++ b/tools/perf/Documentation/manpage-base.xsl @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + sp + + + + + + + + br + + + diff --git a/tools/perf/Documentation/manpage-bold-literal.xsl b/tools/perf/Documentation/manpage-bold-literal.xsl new file mode 100644 index 00000000..608eb5df --- /dev/null +++ b/tools/perf/Documentation/manpage-bold-literal.xsl @@ -0,0 +1,17 @@ + + + + + + + fB + + + fR + + + diff --git a/tools/perf/Documentation/manpage-normal.xsl b/tools/perf/Documentation/manpage-normal.xsl new file mode 100644 index 00000000..a48f5b11 --- /dev/null +++ b/tools/perf/Documentation/manpage-normal.xsl @@ -0,0 +1,13 @@ + + + + + + +\ +. + + diff --git a/tools/perf/Documentation/manpage-suppress-sp.xsl b/tools/perf/Documentation/manpage-suppress-sp.xsl new file mode 100644 index 00000000..a63c7632 --- /dev/null +++ b/tools/perf/Documentation/manpage-suppress-sp.xsl @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + diff --git a/tools/perf/Documentation/perf-annotate.txt b/tools/perf/Documentation/perf-annotate.txt new file mode 100644 index 00000000..e9cd39a9 --- /dev/null +++ b/tools/perf/Documentation/perf-annotate.txt @@ -0,0 +1,101 @@ +perf-annotate(1) +================ + +NAME +---- +perf-annotate - Read perf.data (created by perf record) and display annotated code + +SYNOPSIS +-------- +[verse] +'perf annotate' [-i | --input=file] [symbol_name] + +DESCRIPTION +----------- +This command reads the input file and displays an annotated version of the +code. If the object file has debug symbols then the source code will be +displayed alongside assembly code. + +If there is no debug info in the object, then annotated assembly is displayed. + +OPTIONS +------- +-i:: +--input=:: + Input file name. (default: perf.data unless stdin is a fifo) + +-d:: +--dsos=:: + Only consider symbols in these dsos. +-s:: +--symbol=:: + Symbol to annotate. + +-f:: +--force:: + Don't complain, do it. + +-v:: +--verbose:: + Be more verbose. (Show symbol address, etc) + +-D:: +--dump-raw-trace:: + Dump raw trace in ASCII. + +-k:: +--vmlinux=:: + vmlinux pathname. + +-m:: +--modules:: + Load module symbols. WARNING: use only with -k and LIVE kernel. + +-l:: +--print-line:: + Print matching source lines (may be slow). + +-P:: +--full-paths:: + Don't shorten the displayed pathnames. + +--stdio:: Use the stdio interface. + +--tui:: Use the TUI interface. Use of --tui requires a tty, if one is not + present, as when piping to other commands, the stdio interface is + used. This interfaces starts by centering on the line with more + samples, TAB/UNTAB cycles through the lines with more samples. + +--gtk:: Use the GTK interface. + +-C:: +--cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can + be provided as a comma-separated list with no space: 0,1. Ranges of + CPUs are specified with -: 0-2. Default is to report samples on all + CPUs. + +--asm-raw:: + Show raw instruction encoding of assembly instructions. + +--source:: + Interleave source code with assembly code. Enabled by default, + disable with --no-source. + +--symfs=:: + Look for files with symbols relative to this directory. + +-M:: +--disassembler-style=:: Set disassembler style for objdump. + +--objdump=:: + Path to objdump binary. + +--skip-missing:: + Skip symbols that cannot be annotated. + +--group:: + Show event group information together + +SEE ALSO +-------- +linkperf:perf-record[1], linkperf:perf-report[1] diff --git a/tools/perf/Documentation/perf-archive.txt b/tools/perf/Documentation/perf-archive.txt new file mode 100644 index 00000000..fae174dc --- /dev/null +++ b/tools/perf/Documentation/perf-archive.txt @@ -0,0 +1,22 @@ +perf-archive(1) +=============== + +NAME +---- +perf-archive - Create archive with object files with build-ids found in perf.data file + +SYNOPSIS +-------- +[verse] +'perf archive' [file] + +DESCRIPTION +----------- +This command runs runs perf-buildid-list --with-hits, and collects the files +with the buildids found so that analisys of perf.data contents can be possible +on another machine. + + +SEE ALSO +-------- +linkperf:perf-record[1], linkperf:perf-buildid-list[1], linkperf:perf-report[1] diff --git a/tools/perf/Documentation/perf-bench.txt b/tools/perf/Documentation/perf-bench.txt new file mode 100644 index 00000000..7065cd6f --- /dev/null +++ b/tools/perf/Documentation/perf-bench.txt @@ -0,0 +1,192 @@ +perf-bench(1) +============= + +NAME +---- +perf-bench - General framework for benchmark suites + +SYNOPSIS +-------- +[verse] +'perf bench' [] [] + +DESCRIPTION +----------- +This 'perf bench' command is a general framework for benchmark suites. + +COMMON OPTIONS +-------------- +-f:: +--format=:: +Specify format style. +Current available format styles are: + +'default':: +Default style. This is mainly for human reading. +--------------------- +% perf bench sched pipe # with no style specified +(executing 1000000 pipe operations between two tasks) + Total time:5.855 sec + 5.855061 usecs/op + 170792 ops/sec +--------------------- + +'simple':: +This simple style is friendly for automated +processing by scripts. +--------------------- +% perf bench --format=simple sched pipe # specified simple +5.988 +--------------------- + +SUBSYSTEM +--------- + +'sched':: + Scheduler and IPC mechanisms. + +'mem':: + Memory access performance. + +'all':: + All benchmark subsystems. + +SUITES FOR 'sched' +~~~~~~~~~~~~~~~~~~ +*messaging*:: +Suite for evaluating performance of scheduler and IPC mechanisms. +Based on hackbench by Rusty Russell. + +Options of *messaging* +^^^^^^^^^^^^^^^^^^^^^^ +-p:: +--pipe:: +Use pipe() instead of socketpair() + +-t:: +--thread:: +Be multi thread instead of multi process + +-g:: +--group=:: +Specify number of groups + +-l:: +--loop=:: +Specify number of loops + +Example of *messaging* +^^^^^^^^^^^^^^^^^^^^^^ + +--------------------- +% perf bench sched messaging # run with default +options (20 sender and receiver processes per group) +(10 groups == 400 processes run) + + Total time:0.308 sec + +% perf bench sched messaging -t -g 20 # be multi-thread, with 20 groups +(20 sender and receiver threads per group) +(20 groups == 800 threads run) + + Total time:0.582 sec +--------------------- + +*pipe*:: +Suite for pipe() system call. +Based on pipe-test-1m.c by Ingo Molnar. + +Options of *pipe* +^^^^^^^^^^^^^^^^^ +-l:: +--loop=:: +Specify number of loops. + +Example of *pipe* +^^^^^^^^^^^^^^^^^ + +--------------------- +% perf bench sched pipe +(executing 1000000 pipe operations between two tasks) + + Total time:8.091 sec + 8.091833 usecs/op + 123581 ops/sec + +% perf bench sched pipe -l 1000 # loop 1000 +(executing 1000 pipe operations between two tasks) + + Total time:0.016 sec + 16.948000 usecs/op + 59004 ops/sec +--------------------- + +SUITES FOR 'mem' +~~~~~~~~~~~~~~~~ +*memcpy*:: +Suite for evaluating performance of simple memory copy in various ways. + +Options of *memcpy* +^^^^^^^^^^^^^^^^^^^ +-l:: +--length:: +Specify length of memory to copy (default: 1MB). +Available units are B, KB, MB, GB and TB (case insensitive). + +-r:: +--routine:: +Specify routine to copy (default: default). +Available routines are depend on the architecture. +On x86-64, x86-64-unrolled, x86-64-movsq and x86-64-movsb are supported. + +-i:: +--iterations:: +Repeat memcpy invocation this number of times. + +-c:: +--cycle:: +Use perf's cpu-cycles event instead of gettimeofday syscall. + +-o:: +--only-prefault:: +Show only the result with page faults before memcpy. + +-n:: +--no-prefault:: +Show only the result without page faults before memcpy. + +*memset*:: +Suite for evaluating performance of simple memory set in various ways. + +Options of *memset* +^^^^^^^^^^^^^^^^^^^ +-l:: +--length:: +Specify length of memory to set (default: 1MB). +Available units are B, KB, MB, GB and TB (case insensitive). + +-r:: +--routine:: +Specify routine to set (default: default). +Available routines are depend on the architecture. +On x86-64, x86-64-unrolled, x86-64-stosq and x86-64-stosb are supported. + +-i:: +--iterations:: +Repeat memset invocation this number of times. + +-c:: +--cycle:: +Use perf's cpu-cycles event instead of gettimeofday syscall. + +-o:: +--only-prefault:: +Show only the result with page faults before memset. + +-n:: +--no-prefault:: +Show only the result without page faults before memset. + +SEE ALSO +-------- +linkperf:perf[1] diff --git a/tools/perf/Documentation/perf-buildid-cache.txt b/tools/perf/Documentation/perf-buildid-cache.txt new file mode 100644 index 00000000..e9a8349a --- /dev/null +++ b/tools/perf/Documentation/perf-buildid-cache.txt @@ -0,0 +1,40 @@ +perf-buildid-cache(1) +===================== + +NAME +---- +perf-buildid-cache - Manage build-id cache. + +SYNOPSIS +-------- +[verse] +'perf buildid-cache ' + +DESCRIPTION +----------- +This command manages the build-id cache. It can add and remove files to/from +the cache. In the future it should as well purge older entries, set upper +limits for the space used by the cache, etc. + +OPTIONS +------- +-a:: +--add=:: + Add specified file to the cache. +-r:: +--remove=:: + Remove specified file from the cache. +-M:: +--missing=:: + List missing build ids in the cache for the specified file. +-u:: +--update:: + Update specified file of the cache. It can be used to update kallsyms + kernel dso to vmlinux in order to support annotation. +-v:: +--verbose:: + Be more verbose. + +SEE ALSO +-------- +linkperf:perf-record[1], linkperf:perf-report[1], linkperf:perf-buildid-list[1] diff --git a/tools/perf/Documentation/perf-buildid-list.txt b/tools/perf/Documentation/perf-buildid-list.txt new file mode 100644 index 00000000..25c52efc --- /dev/null +++ b/tools/perf/Documentation/perf-buildid-list.txt @@ -0,0 +1,43 @@ +perf-buildid-list(1) +==================== + +NAME +---- +perf-buildid-list - List the buildids in a perf.data file + +SYNOPSIS +-------- +[verse] +'perf buildid-list ' + +DESCRIPTION +----------- +This command displays the buildids found in a perf.data file, so that other +tools can be used to fetch packages with matching symbol tables for use by +perf report. + +It can also be used to show the build id of the running kernel or in an ELF +file using -i/--input. + +OPTIONS +------- +-H:: +--with-hits:: + Show only DSOs with hits. +-i:: +--input=:: + Input file name. (default: perf.data unless stdin is a fifo) +-f:: +--force:: + Don't do ownership validation. +-k:: +--kernel:: + Show running kernel build id. +-v:: +--verbose:: + Be more verbose. + +SEE ALSO +-------- +linkperf:perf-record[1], linkperf:perf-top[1], +linkperf:perf-report[1] diff --git a/tools/perf/Documentation/perf-diff.txt b/tools/perf/Documentation/perf-diff.txt new file mode 100644 index 00000000..5b3123d5 --- /dev/null +++ b/tools/perf/Documentation/perf-diff.txt @@ -0,0 +1,133 @@ +perf-diff(1) +============ + +NAME +---- +perf-diff - Read two perf.data files and display the differential profile + +SYNOPSIS +-------- +[verse] +'perf diff' [oldfile] [newfile] + +DESCRIPTION +----------- +This command displays the performance difference amongst two perf.data files +captured via perf record. + +If no parameters are passed it will assume perf.data.old and perf.data. + +The differential profile is displayed only for events matching both +specified perf.data files. + +OPTIONS +------- +-D:: +--dump-raw-trace:: + Dump raw trace in ASCII. + +-m:: +--modules:: + Load module symbols. WARNING: use only with -k and LIVE kernel + +-d:: +--dsos=:: + Only consider symbols in these dsos. CSV that understands + file://filename entries. + +-C:: +--comms=:: + Only consider symbols in these comms. CSV that understands + file://filename entries. + +-S:: +--symbols=:: + Only consider these symbols. CSV that understands + file://filename entries. + +-s:: +--sort=:: + Sort by key(s): pid, comm, dso, symbol. + +-t:: +--field-separator=:: + + Use a special separator character and don't pad with spaces, replacing + all occurrences of this separator in symbol names (and other output) + with a '.' character, that thus it's the only non valid separator. + +-v:: +--verbose:: + Be verbose, for instance, show the raw counts in addition to the + diff. + +-f:: +--force:: + Don't complain, do it. + +--symfs=:: + Look for files with symbols relative to this directory. + +-b:: +--baseline-only:: + Show only items with match in baseline. + +-c:: +--compute:: + Differential computation selection - delta,ratio,wdiff (default is delta). + If '+' is specified as a first character, the output is sorted based + on the computation results. + See COMPARISON METHODS section for more info. + +-p:: +--period:: + Show period values for both compared hist entries. + +-F:: +--formula:: + Show formula for given computation. + +COMPARISON METHODS +------------------ +delta +~~~~~ +If specified the 'Delta' column is displayed with value 'd' computed as: + + d = A->period_percent - B->period_percent + +with: + - A/B being matching hist entry from first/second file specified + (or perf.data/perf.data.old) respectively. + + - period_percent being the % of the hist entry period value within + single data file + +ratio +~~~~~ +If specified the 'Ratio' column is displayed with value 'r' computed as: + + r = A->period / B->period + +with: + - A/B being matching hist entry from first/second file specified + (or perf.data/perf.data.old) respectively. + + - period being the hist entry period value + +wdiff +~~~~~ +If specified the 'Weighted diff' column is displayed with value 'd' computed as: + + d = B->period * WEIGHT-A - A->period * WEIGHT-B + + - A/B being matching hist entry from first/second file specified + (or perf.data/perf.data.old) respectively. + + - period being the hist entry period value + + - WEIGHT-A/WEIGHT-B being user suplied weights in the the '-c' option + behind ':' separator like '-c wdiff:1,2'. + +SEE ALSO +-------- +linkperf:perf-record[1] diff --git a/tools/perf/Documentation/perf-evlist.txt b/tools/perf/Documentation/perf-evlist.txt new file mode 100644 index 00000000..1ceb3700 --- /dev/null +++ b/tools/perf/Documentation/perf-evlist.txt @@ -0,0 +1,38 @@ +perf-evlist(1) +============== + +NAME +---- +perf-evlist - List the event names in a perf.data file + +SYNOPSIS +-------- +[verse] +'perf evlist ' + +DESCRIPTION +----------- +This command displays the names of events sampled in a perf.data file. + +OPTIONS +------- +-i:: +--input=:: + Input file name. (default: perf.data unless stdin is a fifo) + +-F:: +--freq=:: + Show just the sample frequency used for each event. + +-v:: +--verbose=:: + Show all fields. + +-g:: +--group:: + Show event group information. + +SEE ALSO +-------- +linkperf:perf-record[1], linkperf:perf-list[1], +linkperf:perf-report[1] diff --git a/tools/perf/Documentation/perf-help.txt b/tools/perf/Documentation/perf-help.txt new file mode 100644 index 00000000..51439181 --- /dev/null +++ b/tools/perf/Documentation/perf-help.txt @@ -0,0 +1,38 @@ +perf-help(1) +============ + +NAME +---- +perf-help - display help information about perf + +SYNOPSIS +-------- +'perf help' [-a|--all] [COMMAND] + +DESCRIPTION +----------- + +With no options and no COMMAND given, the synopsis of the 'perf' +command and a list of the most commonly used perf commands are printed +on the standard output. + +If the option '--all' or '-a' is given, then all available commands are +printed on the standard output. + +If a perf command is named, a manual page for that command is brought +up. The 'man' program is used by default for this purpose, but this +can be overridden by other options or configuration variables. + +Note that `perf --help ...` is identical to `perf help ...` because the +former is internally converted into the latter. + +OPTIONS +------- +-a:: +--all:: + Prints all the available commands on the standard output. This + option supersedes any other option. + +PERF +---- +Part of the linkperf:perf[1] suite diff --git a/tools/perf/Documentation/perf-inject.txt b/tools/perf/Documentation/perf-inject.txt new file mode 100644 index 00000000..a00a3427 --- /dev/null +++ b/tools/perf/Documentation/perf-inject.txt @@ -0,0 +1,46 @@ +perf-inject(1) +============== + +NAME +---- +perf-inject - Filter to augment the events stream with additional information + +SYNOPSIS +-------- +[verse] +'perf inject ' + +DESCRIPTION +----------- +perf-inject reads a perf-record event stream and repipes it to stdout. At any +point the processing code can inject other events into the event stream - in +this case build-ids (-b option) are read and injected as needed into the event +stream. + +Build-ids are just the first user of perf-inject - potentially anything that +needs userspace processing to augment the events stream with additional +information could make use of this facility. + +OPTIONS +------- +-b:: +--build-ids=:: + Inject build-ids into the output stream +-v:: +--verbose:: + Be more verbose. +-i:: +--input=:: + Input file name. (default: stdin) +-o:: +--output=:: + Output file name. (default: stdout) +-s:: +--sched-stat:: + Merge sched_stat and sched_switch for getting events where and how long + tasks slept. sched_switch contains a callchain where a task slept and + sched_stat contains a timeslice how long a task slept. + +SEE ALSO +-------- +linkperf:perf-record[1], linkperf:perf-report[1], linkperf:perf-archive[1] diff --git a/tools/perf/Documentation/perf-kmem.txt b/tools/perf/Documentation/perf-kmem.txt new file mode 100644 index 00000000..7c8fbbf3 --- /dev/null +++ b/tools/perf/Documentation/perf-kmem.txt @@ -0,0 +1,47 @@ +perf-kmem(1) +============ + +NAME +---- +perf-kmem - Tool to trace/measure kernel memory(slab) properties + +SYNOPSIS +-------- +[verse] +'perf kmem' {record|stat} [] + +DESCRIPTION +----------- +There are two variants of perf kmem: + + 'perf kmem record ' to record the kmem events + of an arbitrary workload. + + 'perf kmem stat' to report kernel memory statistics. + +OPTIONS +------- +-i :: +--input=:: + Select the input file (default: perf.data unless stdin is a fifo) + +--caller:: + Show per-callsite statistics + +--alloc:: + Show per-allocation statistics + +-s :: +--sort=:: + Sort the output (default: frag,hit,bytes) + +-l :: +--line=:: + Print n lines only + +--raw-ip:: + Print raw ip instead of symbol + +SEE ALSO +-------- +linkperf:perf-record[1] diff --git a/tools/perf/Documentation/perf-kvm.txt b/tools/perf/Documentation/perf-kvm.txt new file mode 100644 index 00000000..326f2cb3 --- /dev/null +++ b/tools/perf/Documentation/perf-kvm.txt @@ -0,0 +1,100 @@ +perf-kvm(1) +=========== + +NAME +---- +perf-kvm - Tool to trace/measure kvm guest os + +SYNOPSIS +-------- +[verse] +'perf kvm' [--host] [--guest] [--guestmount= + [--guestkallsyms= --guestmodules= | --guestvmlinux=]] + {top|record|report|diff|buildid-list} +'perf kvm' [--host] [--guest] [--guestkallsyms= --guestmodules= + | --guestvmlinux=] {top|record|report|diff|buildid-list|stat} + +DESCRIPTION +----------- +There are a couple of variants of perf kvm: + + 'perf kvm [options] top ' to generates and displays + a performance counter profile of guest os in realtime + of an arbitrary workload. + + 'perf kvm record ' to record the performance counter profile + of an arbitrary workload and save it into a perf data file. If both + --host and --guest are input, the perf data file name is perf.data.kvm. + If there is no --host but --guest, the file name is perf.data.guest. + If there is no --guest but --host, the file name is perf.data.host. + + 'perf kvm report' to display the performance counter profile information + recorded via perf kvm record. + + 'perf kvm diff' to displays the performance difference amongst two perf.data + files captured via perf record. + + 'perf kvm buildid-list' to display the buildids found in a perf data file, + so that other tools can be used to fetch packages with matching symbol tables + for use by perf report. + + 'perf kvm stat ' to run a command and gather performance counter + statistics. + Especially, perf 'kvm stat record/report' generates a statistical analysis + of KVM events. Currently, vmexit, mmio and ioport events are supported. + 'perf kvm stat record ' records kvm events and the events between + start and end . + And this command produces a file which contains tracing results of kvm + events. + + 'perf kvm stat report' reports statistical data which includes events + handled time, samples, and so on. + +OPTIONS +------- +-i:: +--input=:: + Input file name. +-o:: +--output:: + Output file name. +--host=:: + Collect host side performance profile. +--guest=:: + Collect guest side performance profile. +--guestmount=:: + Guest os root file system mount directory. Users mounts guest os + root directories under by a specific filesystem access method, + typically, sshfs. For example, start 2 guest os. The one's pid is 8888 + and the other's is 9999. + #mkdir ~/guestmount; cd ~/guestmount + #sshfs -o allow_other,direct_io -p 5551 localhost:/ 8888/ + #sshfs -o allow_other,direct_io -p 5552 localhost:/ 9999/ + #perf kvm --host --guest --guestmount=~/guestmount top +--guestkallsyms=:: + Guest os /proc/kallsyms file copy. 'perf' kvm' reads it to get guest + kernel symbols. Users copy it out from guest os. +--guestmodules=:: + Guest os /proc/modules file copy. 'perf' kvm' reads it to get guest + kernel module information. Users copy it out from guest os. +--guestvmlinux=:: + Guest os kernel vmlinux. + +STAT REPORT OPTIONS +------------------- +--vcpu=:: + analyze events which occures on this vcpu. (default: all vcpus) + +--events=:: + events to be analyzed. Possible values: vmexit, mmio, ioport. + (default: vmexit) +-k:: +--key=:: + Sorting key. Possible values: sample (default, sort by samples + number), time (sort by average time). + +SEE ALSO +-------- +linkperf:perf-top[1], linkperf:perf-record[1], linkperf:perf-report[1], +linkperf:perf-diff[1], linkperf:perf-buildid-list[1], +linkperf:perf-stat[1] diff --git a/tools/perf/Documentation/perf-list.txt b/tools/perf/Documentation/perf-list.txt new file mode 100644 index 00000000..d1e39dc8 --- /dev/null +++ b/tools/perf/Documentation/perf-list.txt @@ -0,0 +1,118 @@ +perf-list(1) +============ + +NAME +---- +perf-list - List all symbolic event types + +SYNOPSIS +-------- +[verse] +'perf list' [hw|sw|cache|tracepoint|event_glob] + +DESCRIPTION +----------- +This command displays the symbolic event types which can be selected in the +various perf commands with the -e option. + +[[EVENT_MODIFIERS]] +EVENT MODIFIERS +--------------- + +Events can optionally have a modifer by appending a colon and one or +more modifiers. Modifiers allow the user to restrict the events to be +counted. The following modifiers exist: + + u - user-space counting + k - kernel counting + h - hypervisor counting + G - guest counting (in KVM guests) + H - host counting (not in KVM guests) + p - precise level + +The 'p' modifier can be used for specifying how precise the instruction +address should be. The 'p' modifier can be specified multiple times: + + 0 - SAMPLE_IP can have arbitrary skid + 1 - SAMPLE_IP must have constant skid + 2 - SAMPLE_IP requested to have 0 skid + 3 - SAMPLE_IP must have 0 skid + +For Intel systems precise event sampling is implemented with PEBS +which supports up to precise-level 2. + +On AMD systems it is implemented using IBS (up to precise-level 2). +The precise modifier works with event types 0x76 (cpu-cycles, CPU +clocks not halted) and 0xC1 (micro-ops retired). Both events map to +IBS execution sampling (IBS op) with the IBS Op Counter Control bit +(IbsOpCntCtl) set respectively (see AMD64 Architecture Programmer’s +Manual Volume 2: System Programming, 13.3 Instruction-Based +Sampling). Examples to use IBS: + + perf record -a -e cpu-cycles:p ... # use ibs op counting cycles + perf record -a -e r076:p ... # same as -e cpu-cycles:p + perf record -a -e r0C1:p ... # use ibs op counting micro-ops + +RAW HARDWARE EVENT DESCRIPTOR +----------------------------- +Even when an event is not available in a symbolic form within perf right now, +it can be encoded in a per processor specific way. + +For instance For x86 CPUs NNN represents the raw register encoding with the +layout of IA32_PERFEVTSELx MSRs (see [Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3B: System Programming Guide] Figure 30-1 Layout +of IA32_PERFEVTSELx MSRs) or AMD's PerfEvtSeln (see [AMD64 Architecture Programmer’s Manual Volume 2: System Programming], Page 344, +Figure 13-7 Performance Event-Select Register (PerfEvtSeln)). + +Note: Only the following bit fields can be set in x86 counter +registers: event, umask, edge, inv, cmask. Esp. guest/host only and +OS/user mode flags must be setup using <>. + +Example: + +If the Intel docs for a QM720 Core i7 describe an event as: + + Event Umask Event Mask + Num. Value Mnemonic Description Comment + + A8H 01H LSD.UOPS Counts the number of micro-ops Use cmask=1 and + delivered by loop stream detector invert to count + cycles + +raw encoding of 0x1A8 can be used: + + perf stat -e r1a8 -a sleep 1 + perf record -e r1a8 ... + +You should refer to the processor specific documentation for getting these +details. Some of them are referenced in the SEE ALSO section below. + +OPTIONS +------- + +Without options all known events will be listed. + +To limit the list use: + +. 'hw' or 'hardware' to list hardware events such as cache-misses, etc. + +. 'sw' or 'software' to list software events such as context switches, etc. + +. 'cache' or 'hwcache' to list hardware cache events such as L1-dcache-loads, etc. + +. 'tracepoint' to list all tracepoint events, alternatively use + 'subsys_glob:event_glob' to filter by tracepoint subsystems such as sched, + block, etc. + +. If none of the above is matched, it will apply the supplied glob to all + events, printing the ones that match. + +One or more types can be used at the same time, listing the events for the +types specified. + +SEE ALSO +-------- +linkperf:perf-stat[1], linkperf:perf-top[1], +linkperf:perf-record[1], +http://www.intel.com/Assets/PDF/manual/253669.pdf[Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3B: System Programming Guide], +http://support.amd.com/us/Processor_TechDocs/24593_APM_v2.pdf[AMD64 Architecture Programmer’s Manual Volume 2: System Programming] diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentation/perf-lock.txt new file mode 100644 index 00000000..c7f5f556 --- /dev/null +++ b/tools/perf/Documentation/perf-lock.txt @@ -0,0 +1,66 @@ +perf-lock(1) +============ + +NAME +---- +perf-lock - Analyze lock events + +SYNOPSIS +-------- +[verse] +'perf lock' {record|report|script|info} + +DESCRIPTION +----------- +You can analyze various lock behaviours +and statistics with this 'perf lock' command. + + 'perf lock record ' records lock events + between start and end . And this command + produces the file "perf.data" which contains tracing + results of lock events. + + 'perf lock report' reports statistical data. + + 'perf lock script' shows raw lock events. + + 'perf lock info' shows metadata like threads or addresses + of lock instances. + +COMMON OPTIONS +-------------- + +-i:: +--input=:: + Input file name. (default: perf.data unless stdin is a fifo) + +-v:: +--verbose:: + Be more verbose (show symbol address, etc). + +-D:: +--dump-raw-trace:: + Dump raw trace in ASCII. + +REPORT OPTIONS +-------------- + +-k:: +--key=:: + Sorting key. Possible values: acquired (default), contended, + wait_total, wait_max, wait_min. + +INFO OPTIONS +------------ + +-t:: +--threads:: + dump thread list in perf.data + +-m:: +--map:: + dump map of lock instances (address:name table) + +SEE ALSO +-------- +linkperf:perf[1] diff --git a/tools/perf/Documentation/perf-mem.txt b/tools/perf/Documentation/perf-mem.txt new file mode 100644 index 00000000..888d5113 --- /dev/null +++ b/tools/perf/Documentation/perf-mem.txt @@ -0,0 +1,48 @@ +perf-mem(1) +=========== + +NAME +---- +perf-mem - Profile memory accesses + +SYNOPSIS +-------- +[verse] +'perf mem' [] (record [] | report) + +DESCRIPTION +----------- +"perf mem -t record" runs a command and gathers memory operation data +from it, into perf.data. Perf record options are accepted and are passed through. + +"perf mem -t report" displays the result. It invokes perf report with the +right set of options to display a memory access profile. + +OPTIONS +------- +...:: + Any command you can specify in a shell. + +-t:: +--type=:: + Select the memory operation type: load or store (default: load) + +-D:: +--dump-raw-samples=:: + Dump the raw decoded samples on the screen in a format that is easy to parse with + one sample per line. + +-x:: +--field-separator:: + Specify the field separator used when dump raw samples (-D option). By default, + The separator is the space character. + +-C:: +--cpu-list:: + Restrict dump of raw samples to those provided via this option. Note that the same + option can be passed in record mode. It will be interpreted the same way as perf + record. + +SEE ALSO +-------- +linkperf:perf-record[1], linkperf:perf-report[1] diff --git a/tools/perf/Documentation/perf-probe.txt b/tools/perf/Documentation/perf-probe.txt new file mode 100644 index 00000000..b715cb71 --- /dev/null +++ b/tools/perf/Documentation/perf-probe.txt @@ -0,0 +1,205 @@ +perf-probe(1) +============= + +NAME +---- +perf-probe - Define new dynamic tracepoints + +SYNOPSIS +-------- +[verse] +'perf probe' [options] --add='PROBE' [...] +or +'perf probe' [options] PROBE +or +'perf probe' [options] --del='[GROUP:]EVENT' [...] +or +'perf probe' --list +or +'perf probe' [options] --line='LINE' +or +'perf probe' [options] --vars='PROBEPOINT' + +DESCRIPTION +----------- +This command defines dynamic tracepoint events, by symbol and registers +without debuginfo, or by C expressions (C line numbers, C function names, +and C local variables) with debuginfo. + + +OPTIONS +------- +-k:: +--vmlinux=PATH:: + Specify vmlinux path which has debuginfo (Dwarf binary). + +-m:: +--module=MODNAME|PATH:: + Specify module name in which perf-probe searches probe points + or lines. If a path of module file is passed, perf-probe + treat it as an offline module (this means you can add a probe on + a module which has not been loaded yet). + +-s:: +--source=PATH:: + Specify path to kernel source. + +-v:: +--verbose:: + Be more verbose (show parsed arguments, etc). + +-a:: +--add=:: + Define a probe event (see PROBE SYNTAX for detail). + +-d:: +--del=:: + Delete probe events. This accepts glob wildcards('*', '?') and character + classes(e.g. [a-z], [!A-Z]). + +-l:: +--list:: + List up current probe events. + +-L:: +--line=:: + Show source code lines which can be probed. This needs an argument + which specifies a range of the source code. (see LINE SYNTAX for detail) + +-V:: +--vars=:: + Show available local variables at given probe point. The argument + syntax is same as PROBE SYNTAX, but NO ARGs. + +--externs:: + (Only for --vars) Show external defined variables in addition to local + variables. + +-F:: +--funcs:: + Show available functions in given module or kernel. With -x/--exec, + can also list functions in a user space executable / shared library. + +--filter=FILTER:: + (Only for --vars and --funcs) Set filter. FILTER is a combination of glob + pattern, see FILTER PATTERN for detail. + Default FILTER is "!__k???tab_* & !__crc_*" for --vars, and "!_*" + for --funcs. + If several filters are specified, only the last filter is used. + +-f:: +--force:: + Forcibly add events with existing name. + +-n:: +--dry-run:: + Dry run. With this option, --add and --del doesn't execute actual + adding and removal operations. + +--max-probes:: + Set the maximum number of probe points for an event. Default is 128. + +-x:: +--exec=PATH:: + Specify path to the executable or shared library file for user + space tracing. Can also be used with --funcs option. + +In absence of -m/-x options, perf probe checks if the first argument after +the options is an absolute path name. If its an absolute path, perf probe +uses it as a target module/target user space binary to probe. + +PROBE SYNTAX +------------ +Probe points are defined by following syntax. + + 1) Define event based on function name + [EVENT=]FUNC[@SRC][:RLN|+OFFS|%return|;PTN] [ARG ...] + + 2) Define event based on source file with line number + [EVENT=]SRC:ALN [ARG ...] + + 3) Define event based on source file with lazy pattern + [EVENT=]SRC;PTN [ARG ...] + + +'EVENT' specifies the name of new event, if omitted, it will be set the name of the probed function. Currently, event group name is set as 'probe'. +'FUNC' specifies a probed function name, and it may have one of the following options; '+OFFS' is the offset from function entry address in bytes, ':RLN' is the relative-line number from function entry line, and '%return' means that it probes function return. And ';PTN' means lazy matching pattern (see LAZY MATCHING). Note that ';PTN' must be the end of the probe point definition. In addition, '@SRC' specifies a source file which has that function. +It is also possible to specify a probe point by the source line number or lazy matching by using 'SRC:ALN' or 'SRC;PTN' syntax, where 'SRC' is the source file path, ':ALN' is the line number and ';PTN' is the lazy matching pattern. +'ARG' specifies the arguments of this probe point, (see PROBE ARGUMENT). + +PROBE ARGUMENT +-------------- +Each probe argument follows below syntax. + + [NAME=]LOCALVAR|$retval|%REG|@SYMBOL[:TYPE] + +'NAME' specifies the name of this argument (optional). You can use the name of local variable, local data structure member (e.g. var->field, var.field2), local array with fixed index (e.g. array[1], var->array[0], var->pointer[2]), or kprobe-tracer argument format (e.g. $retval, %ax, etc). Note that the name of this argument will be set as the last member name if you specify a local data structure member (e.g. field2 for 'var->field1.field2'.) +'TYPE' casts the type of this argument (optional). If omitted, perf probe automatically set the type based on debuginfo. You can specify 'string' type only for the local variable or structure member which is an array of or a pointer to 'char' or 'unsigned char' type. + +LINE SYNTAX +----------- +Line range is described by following syntax. + + "FUNC[@SRC][:RLN[+NUM|-RLN2]]|SRC[:ALN[+NUM|-ALN2]]" + +FUNC specifies the function name of showing lines. 'RLN' is the start line +number from function entry line, and 'RLN2' is the end line number. As same as +probe syntax, 'SRC' means the source file path, 'ALN' is start line number, +and 'ALN2' is end line number in the file. It is also possible to specify how +many lines to show by using 'NUM'. Moreover, 'FUNC@SRC' combination is good +for searching a specific function when several functions share same name. +So, "source.c:100-120" shows lines between 100th to l20th in source.c file. And "func:10+20" shows 20 lines from 10th line of func function. + +LAZY MATCHING +------------- + The lazy line matching is similar to glob matching but ignoring spaces in both of pattern and target. So this accepts wildcards('*', '?') and character classes(e.g. [a-z], [!A-Z]). + +e.g. + 'a=*' can matches 'a=b', 'a = b', 'a == b' and so on. + +This provides some sort of flexibility and robustness to probe point definitions against minor code changes. For example, actual 10th line of schedule() can be moved easily by modifying schedule(), but the same line matching 'rq=cpu_rq*' may still exist in the function.) + +FILTER PATTERN +-------------- + The filter pattern is a glob matching pattern(s) to filter variables. + In addition, you can use "!" for specifying filter-out rule. You also can give several rules combined with "&" or "|", and fold those rules as one rule by using "(" ")". + +e.g. + With --filter "foo* | bar*", perf probe -V shows variables which start with "foo" or "bar". + With --filter "!foo* & *bar", perf probe -V shows variables which don't start with "foo" and end with "bar", like "fizzbar". But "foobar" is filtered out. + +EXAMPLES +-------- +Display which lines in schedule() can be probed: + + ./perf probe --line schedule + +Add a probe on schedule() function 12th line with recording cpu local variable: + + ./perf probe schedule:12 cpu + or + ./perf probe --add='schedule:12 cpu' + + this will add one or more probes which has the name start with "schedule". + + Add probes on lines in schedule() function which calls update_rq_clock(). + + ./perf probe 'schedule;update_rq_clock*' + or + ./perf probe --add='schedule;update_rq_clock*' + +Delete all probes on schedule(). + + ./perf probe --del='schedule*' + +Add probes at zfree() function on /bin/zsh + + ./perf probe -x /bin/zsh zfree or ./perf probe /bin/zsh zfree + +Add probes at malloc() function on libc + + ./perf probe -x /lib/libc.so.6 malloc or ./perf probe /lib/libc.so.6 malloc + +SEE ALSO +-------- +linkperf:perf-trace[1], linkperf:perf-record[1] diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt new file mode 100644 index 00000000..d4da111e --- /dev/null +++ b/tools/perf/Documentation/perf-record.txt @@ -0,0 +1,193 @@ +perf-record(1) +============== + +NAME +---- +perf-record - Run a command and record its profile into perf.data + +SYNOPSIS +-------- +[verse] +'perf record' [-e | --event=EVENT] [-l] [-a] +'perf record' [-e | --event=EVENT] [-l] [-a] -- [] + +DESCRIPTION +----------- +This command runs a command and gathers a performance counter profile +from it, into perf.data - without displaying anything. + +This file can then be inspected later on, using 'perf report'. + + +OPTIONS +------- +...:: + Any command you can specify in a shell. + +-e:: +--event=:: + Select the PMU event. Selection can be: + + - a symbolic event name (use 'perf list' to list all events) + + - a raw PMU event (eventsel+umask) in the form of rNNN where NNN is a + hexadecimal event descriptor. + + - a hardware breakpoint event in the form of '\mem:addr[:access]' + where addr is the address in memory you want to break in. + Access is the memory access type (read, write, execute) it can + be passed as follows: '\mem:addr[:[r][w][x]]'. + If you want to profile read-write accesses in 0x1000, just set + 'mem:0x1000:rw'. + +--filter=:: + Event filter. + +-a:: +--all-cpus:: + System-wide collection from all CPUs. + +-l:: + Scale counter values. + +-p:: +--pid=:: + Record events on existing process ID (comma separated list). + +-t:: +--tid=:: + Record events on existing thread ID (comma separated list). + +-u:: +--uid=:: + Record events in threads owned by uid. Name or number. + +-r:: +--realtime=:: + Collect data with this RT SCHED_FIFO priority. +-D:: +--no-delay:: + Collect data without buffering. +-A:: +--append:: + Append to the output file to do incremental profiling. + +-f:: +--force:: + Overwrite existing data file. (deprecated) + +-c:: +--count=:: + Event period to sample. + +-o:: +--output=:: + Output file name. + +-i:: +--no-inherit:: + Child tasks do not inherit counters. +-F:: +--freq=:: + Profile at this frequency. + +-m:: +--mmap-pages=:: + Number of mmap data pages. Must be a power of two. + +-g:: +--call-graph:: + Do call-graph (stack chain/backtrace) recording. + +-q:: +--quiet:: + Don't print any message, useful for scripting. + +-v:: +--verbose:: + Be more verbose (show counter open errors, etc). + +-s:: +--stat:: + Per thread counts. + +-d:: +--data:: + Sample addresses. + +-T:: +--timestamp:: + Sample timestamps. Use it with 'perf report -D' to see the timestamps, + for instance. + +-n:: +--no-samples:: + Don't sample. + +-R:: +--raw-samples:: +Collect raw sample records from all opened counters (default for tracepoint counters). + +-C:: +--cpu:: +Collect samples only on the list of CPUs provided. Multiple CPUs can be provided as a +comma-separated list with no space: 0,1. Ranges of CPUs are specified with -: 0-2. +In per-thread mode with inheritance mode on (default), samples are captured only when +the thread executes on the designated CPUs. Default is to monitor all CPUs. + +-N:: +--no-buildid-cache:: +Do not update the builid cache. This saves some overhead in situations +where the information in the perf.data file (which includes buildids) +is sufficient. + +-G name,...:: +--cgroup name,...:: +monitor only in the container (cgroup) called "name". This option is available only +in per-cpu mode. The cgroup filesystem must be mounted. All threads belonging to +container "name" are monitored when they run on the monitored CPUs. Multiple cgroups +can be provided. Each cgroup is applied to the corresponding event, i.e., first cgroup +to first event, second cgroup to second event and so on. It is possible to provide +an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have +corresponding events, i.e., they always refer to events defined earlier on the command +line. + +-b:: +--branch-any:: +Enable taken branch stack sampling. Any type of taken branch may be sampled. +This is a shortcut for --branch-filter any. See --branch-filter for more infos. + +-j:: +--branch-filter:: +Enable taken branch stack sampling. Each sample captures a series of consecutive +taken branches. The number of branches captured with each sample depends on the +underlying hardware, the type of branches of interest, and the executed code. +It is possible to select the types of branches captured by enabling filters. The +following filters are defined: + + - any: any type of branches + - any_call: any function call or system call + - any_ret: any function return or system call return + - ind_call: any indirect branch + - u: only when the branch target is at the user level + - k: only when the branch target is in the kernel + - hv: only when the target is at the hypervisor level + ++ +The option requires at least one branch type among any, any_call, any_ret, ind_call. +The privilege levels may be omitted, in which case, the privilege levels of the associated +event are applied to the branch filter. Both kernel (k) and hypervisor (hv) privilege +levels are subject to permissions. When sampling on multiple events, branch stack sampling +is enabled for all the sampling events. The sampled branch type is the same for all events. +The various filters must be specified as a comma separated list: --branch-filter any_ret,u,k +Note that this feature may not be available on all processors. + +-W:: +--weight:: +Enable weightened sampling. An additional weight is recorded per sample and can be +displayed with the weight and local_weight sort keys. This currently works for TSX +abort events and some memory events in precise mode on modern Intel CPUs. + +SEE ALSO +-------- +linkperf:perf-stat[1], linkperf:perf-list[1] diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt new file mode 100644 index 00000000..7d5f4f38 --- /dev/null +++ b/tools/perf/Documentation/perf-report.txt @@ -0,0 +1,215 @@ +perf-report(1) +============== + +NAME +---- +perf-report - Read perf.data (created by perf record) and display the profile + +SYNOPSIS +-------- +[verse] +'perf report' [-i | --input=file] + +DESCRIPTION +----------- +This command displays the performance counter profile information recorded +via perf record. + +OPTIONS +------- +-i:: +--input=:: + Input file name. (default: perf.data unless stdin is a fifo) + +-v:: +--verbose:: + Be more verbose. (show symbol address, etc) + +-d:: +--dsos=:: + Only consider symbols in these dsos. CSV that understands + file://filename entries. +-n:: +--show-nr-samples:: + Show the number of samples for each symbol + +--showcpuutilization:: + Show sample percentage for different cpu modes. + +-T:: +--threads:: + Show per-thread event counters +-c:: +--comms=:: + Only consider symbols in these comms. CSV that understands + file://filename entries. +-S:: +--symbols=:: + Only consider these symbols. CSV that understands + file://filename entries. + +--symbol-filter=:: + Only show symbols that match (partially) with this filter. + +-U:: +--hide-unresolved:: + Only display entries resolved to a symbol. + +-s:: +--sort=:: + Sort histogram entries by given key(s) - multiple keys can be specified + in CSV format. Following sort keys are available: + pid, comm, dso, symbol, parent, cpu, srcline, weight, local_weight. + + Each key has following meaning: + + - comm: command (name) of the task which can be read via /proc//comm + - pid: command and tid of the task + - dso: name of library or module executed at the time of sample + - symbol: name of function executed at the time of sample + - parent: name of function matched to the parent regex filter. Unmatched + entries are displayed as "[other]". + - cpu: cpu number the task ran at the time of sample + - srcline: filename and line number executed at the time of sample. The + DWARF debuggin info must be provided. + + By default, comm, dso and symbol keys are used. + (i.e. --sort comm,dso,symbol) + + If --branch-stack option is used, following sort keys are also + available: + dso_from, dso_to, symbol_from, symbol_to, mispredict. + + - dso_from: name of library or module branched from + - dso_to: name of library or module branched to + - symbol_from: name of function branched from + - symbol_to: name of function branched to + - mispredict: "N" for predicted branch, "Y" for mispredicted branch + + And default sort keys are changed to comm, dso_from, symbol_from, dso_to + and symbol_to, see '--branch-stack'. + +-p:: +--parent=:: + A regex filter to identify parent. The parent is a caller of this + function and searched through the callchain, thus it requires callchain + information recorded. The pattern is in the exteneded regex format and + defaults to "\^sys_|^do_page_fault", see '--sort parent'. + +-x:: +--exclude-other:: + Only display entries with parent-match. + +-w:: +--column-widths=:: + Force each column width to the provided list, for large terminal + readability. + +-t:: +--field-separator=:: + Use a special separator character and don't pad with spaces, replacing + all occurrences of this separator in symbol names (and other output) + with a '.' character, that thus it's the only non valid separator. + +-D:: +--dump-raw-trace:: + Dump raw trace in ASCII. + +-g [type,min[,limit],order]:: +--call-graph:: + Display call chains using type, min percent threshold, optional print + limit and order. + type can be either: + - flat: single column, linear exposure of call chains. + - graph: use a graph tree, displaying absolute overhead rates. + - fractal: like graph, but displays relative rates. Each branch of + the tree is considered as a new profiled object. + + + order can be either: + - callee: callee based call graph. + - caller: inverted caller based call graph. + + Default: fractal,0.5,callee. + +-G:: +--inverted:: + alias for inverted caller based call graph. + +--pretty=:: + Pretty printing style. key: normal, raw + +--stdio:: Use the stdio interface. + +--tui:: Use the TUI interface, that is integrated with annotate and allows + zooming into DSOs or threads, among other features. Use of --tui + requires a tty, if one is not present, as when piping to other + commands, the stdio interface is used. + +--gtk:: Use the GTK2 interface. + +-k:: +--vmlinux=:: + vmlinux pathname + +--kallsyms=:: + kallsyms pathname + +-m:: +--modules:: + Load module symbols. WARNING: This should only be used with -k and + a LIVE kernel. + +-f:: +--force:: + Don't complain, do it. + +--symfs=:: + Look for files with symbols relative to this directory. + +-C:: +--cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can + be provided as a comma-separated list with no space: 0,1. Ranges of + CPUs are specified with -: 0-2. Default is to report samples on all + CPUs. + +-M:: +--disassembler-style=:: Set disassembler style for objdump. + +--source:: + Interleave source code with assembly code. Enabled by default, + disable with --no-source. + +--asm-raw:: + Show raw instruction encoding of assembly instructions. + +--show-total-period:: Show a column with the sum of periods. + +-I:: +--show-info:: + Display extended information about the perf.data file. This adds + information which may be very large and thus may clutter the display. + It currently includes: cpu and numa topology of the host system. + +-b:: +--branch-stack:: + Use the addresses of sampled taken branches instead of the instruction + address to build the histograms. To generate meaningful output, the + perf.data file must have been obtained using perf record -b or + perf record --branch-filter xxx where xxx is a branch filter option. + perf report is able to auto-detect whether a perf.data file contains + branch stacks and it will automatically switch to the branch view mode, + unless --no-branch-stack is used. + +--objdump=:: + Path to objdump binary. + +--group:: + Show event group information together. + +--demangle:: + Demangle symbol names to human readable form. It's enabled by default, + disable with --no-demangle. + +SEE ALSO +-------- +linkperf:perf-stat[1], linkperf:perf-annotate[1] diff --git a/tools/perf/Documentation/perf-sched.txt b/tools/perf/Documentation/perf-sched.txt new file mode 100644 index 00000000..8ff4df95 --- /dev/null +++ b/tools/perf/Documentation/perf-sched.txt @@ -0,0 +1,55 @@ +perf-sched(1) +============== + +NAME +---- +perf-sched - Tool to trace/measure scheduler properties (latencies) + +SYNOPSIS +-------- +[verse] +'perf sched' {record|latency|map|replay|script} + +DESCRIPTION +----------- +There are five variants of perf sched: + + 'perf sched record ' to record the scheduling events + of an arbitrary workload. + + 'perf sched latency' to report the per task scheduling latencies + and other scheduling properties of the workload. + + 'perf sched script' to see a detailed trace of the workload that + was recorded (aliased to 'perf script' for now). + + 'perf sched replay' to simulate the workload that was recorded + via perf sched record. (this is done by starting up mockup threads + that mimic the workload based on the events in the trace. These + threads can then replay the timings (CPU runtime and sleep patterns) + of the workload as it occurred when it was recorded - and can repeat + it a number of times, measuring its performance.) + + 'perf sched map' to print a textual context-switching outline of + workload captured via perf sched record. Columns stand for + individual CPUs, and the two-letter shortcuts stand for tasks that + are running on a CPU. A '*' denotes the CPU that had the event, and + a dot signals an idle CPU. + +OPTIONS +------- +-i:: +--input=:: + Input file name. (default: perf.data unless stdin is a fifo) + +-v:: +--verbose:: + Be more verbose. (show symbol address, etc) + +-D:: +--dump-raw-trace=:: + Display verbose dump of the sched data. + +SEE ALSO +-------- +linkperf:perf-record[1] diff --git a/tools/perf/Documentation/perf-script-perl.txt b/tools/perf/Documentation/perf-script-perl.txt new file mode 100644 index 00000000..d00bef23 --- /dev/null +++ b/tools/perf/Documentation/perf-script-perl.txt @@ -0,0 +1,216 @@ +perf-script-perl(1) +================== + +NAME +---- +perf-script-perl - Process trace data with a Perl script + +SYNOPSIS +-------- +[verse] +'perf script' [-s [Perl]:script[.pl] ] + +DESCRIPTION +----------- + +This perf script option is used to process perf script data using perf's +built-in Perl interpreter. It reads and processes the input file and +displays the results of the trace analysis implemented in the given +Perl script, if any. + +STARTER SCRIPTS +--------------- + +You can avoid reading the rest of this document by running 'perf script +-g perl' in the same directory as an existing perf.data trace file. +That will generate a starter script containing a handler for each of +the event types in the trace file; it simply prints every available +field for each event in the trace file. + +You can also look at the existing scripts in +~/libexec/perf-core/scripts/perl for typical examples showing how to +do basic things like aggregate event data, print results, etc. Also, +the check-perf-script.pl script, while not interesting for its results, +attempts to exercise all of the main scripting features. + +EVENT HANDLERS +-------------- + +When perf script is invoked using a trace script, a user-defined +'handler function' is called for each event in the trace. If there's +no handler function defined for a given event type, the event is +ignored (or passed to a 'trace_handled' function, see below) and the +next event is processed. + +Most of the event's field values are passed as arguments to the +handler function; some of the less common ones aren't - those are +available as calls back into the perf executable (see below). + +As an example, the following perf record command can be used to record +all sched_wakeup events in the system: + + # perf record -a -e sched:sched_wakeup + +Traces meant to be processed using a script should be recorded with +the above option: -a to enable system-wide collection. + +The format file for the sched_wakep event defines the following fields +(see /sys/kernel/debug/tracing/events/sched/sched_wakeup/format): + +---- + format: + field:unsigned short common_type; + field:unsigned char common_flags; + field:unsigned char common_preempt_count; + field:int common_pid; + + field:char comm[TASK_COMM_LEN]; + field:pid_t pid; + field:int prio; + field:int success; + field:int target_cpu; +---- + +The handler function for this event would be defined as: + +---- +sub sched::sched_wakeup +{ + my ($event_name, $context, $common_cpu, $common_secs, + $common_nsecs, $common_pid, $common_comm, + $comm, $pid, $prio, $success, $target_cpu) = @_; +} +---- + +The handler function takes the form subsystem::event_name. + +The $common_* arguments in the handler's argument list are the set of +arguments passed to all event handlers; some of the fields correspond +to the common_* fields in the format file, but some are synthesized, +and some of the common_* fields aren't common enough to to be passed +to every event as arguments but are available as library functions. + +Here's a brief description of each of the invariant event args: + + $event_name the name of the event as text + $context an opaque 'cookie' used in calls back into perf + $common_cpu the cpu the event occurred on + $common_secs the secs portion of the event timestamp + $common_nsecs the nsecs portion of the event timestamp + $common_pid the pid of the current task + $common_comm the name of the current process + +All of the remaining fields in the event's format file have +counterparts as handler function arguments of the same name, as can be +seen in the example above. + +The above provides the basics needed to directly access every field of +every event in a trace, which covers 90% of what you need to know to +write a useful trace script. The sections below cover the rest. + +SCRIPT LAYOUT +------------- + +Every perf script Perl script should start by setting up a Perl module +search path and 'use'ing a few support modules (see module +descriptions below): + +---- + use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib"; + use lib "./Perf-Trace-Util/lib"; + use Perf::Trace::Core; + use Perf::Trace::Context; + use Perf::Trace::Util; +---- + +The rest of the script can contain handler functions and support +functions in any order. + +Aside from the event handler functions discussed above, every script +can implement a set of optional functions: + +*trace_begin*, if defined, is called before any event is processed and +gives scripts a chance to do setup tasks: + +---- + sub trace_begin + { + } +---- + +*trace_end*, if defined, is called after all events have been + processed and gives scripts a chance to do end-of-script tasks, such + as display results: + +---- +sub trace_end +{ +} +---- + +*trace_unhandled*, if defined, is called after for any event that + doesn't have a handler explicitly defined for it. The standard set + of common arguments are passed into it: + +---- +sub trace_unhandled +{ + my ($event_name, $context, $common_cpu, $common_secs, + $common_nsecs, $common_pid, $common_comm) = @_; +} +---- + +The remaining sections provide descriptions of each of the available +built-in perf script Perl modules and their associated functions. + +AVAILABLE MODULES AND FUNCTIONS +------------------------------- + +The following sections describe the functions and variables available +via the various Perf::Trace::* Perl modules. To use the functions and +variables from the given module, add the corresponding 'use +Perf::Trace::XXX' line to your perf script script. + +Perf::Trace::Core Module +~~~~~~~~~~~~~~~~~~~~~~~~ + +These functions provide some essential functions to user scripts. + +The *flag_str* and *symbol_str* functions provide human-readable +strings for flag and symbolic fields. These correspond to the strings +and values parsed from the 'print fmt' fields of the event format +files: + + flag_str($event_name, $field_name, $field_value) - returns the string represention corresponding to $field_value for the flag field $field_name of event $event_name + symbol_str($event_name, $field_name, $field_value) - returns the string represention corresponding to $field_value for the symbolic field $field_name of event $event_name + +Perf::Trace::Context Module +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Some of the 'common' fields in the event format file aren't all that +common, but need to be made accessible to user scripts nonetheless. + +Perf::Trace::Context defines a set of functions that can be used to +access this data in the context of the current event. Each of these +functions expects a $context variable, which is the same as the +$context variable passed into every event handler as the second +argument. + + common_pc($context) - returns common_preempt count for the current event + common_flags($context) - returns common_flags for the current event + common_lock_depth($context) - returns common_lock_depth for the current event + +Perf::Trace::Util Module +~~~~~~~~~~~~~~~~~~~~~~~~ + +Various utility functions for use with perf script: + + nsecs($secs, $nsecs) - returns total nsecs given secs/nsecs pair + nsecs_secs($nsecs) - returns whole secs portion given nsecs + nsecs_nsecs($nsecs) - returns nsecs remainder given nsecs + nsecs_str($nsecs) - returns printable string in the form secs.nsecs + avg($total, $n) - returns average given a sum and a total number of values + +SEE ALSO +-------- +linkperf:perf-script[1] diff --git a/tools/perf/Documentation/perf-script-python.txt b/tools/perf/Documentation/perf-script-python.txt new file mode 100644 index 00000000..9f1f054b --- /dev/null +++ b/tools/perf/Documentation/perf-script-python.txt @@ -0,0 +1,620 @@ +perf-script-python(1) +==================== + +NAME +---- +perf-script-python - Process trace data with a Python script + +SYNOPSIS +-------- +[verse] +'perf script' [-s [Python]:script[.py] ] + +DESCRIPTION +----------- + +This perf script option is used to process perf script data using perf's +built-in Python interpreter. It reads and processes the input file and +displays the results of the trace analysis implemented in the given +Python script, if any. + +A QUICK EXAMPLE +--------------- + +This section shows the process, start to finish, of creating a working +Python script that aggregates and extracts useful information from a +raw perf script stream. You can avoid reading the rest of this +document if an example is enough for you; the rest of the document +provides more details on each step and lists the library functions +available to script writers. + +This example actually details the steps that were used to create the +'syscall-counts' script you see when you list the available perf script +scripts via 'perf script -l'. As such, this script also shows how to +integrate your script into the list of general-purpose 'perf script' +scripts listed by that command. + +The syscall-counts script is a simple script, but demonstrates all the +basic ideas necessary to create a useful script. Here's an example +of its output (syscall names are not yet supported, they will appear +as numbers): + +---- +syscall events: + +event count +---------------------------------------- ----------- +sys_write 455067 +sys_getdents 4072 +sys_close 3037 +sys_swapoff 1769 +sys_read 923 +sys_sched_setparam 826 +sys_open 331 +sys_newfstat 326 +sys_mmap 217 +sys_munmap 216 +sys_futex 141 +sys_select 102 +sys_poll 84 +sys_setitimer 12 +sys_writev 8 +15 8 +sys_lseek 7 +sys_rt_sigprocmask 6 +sys_wait4 3 +sys_ioctl 3 +sys_set_robust_list 1 +sys_exit 1 +56 1 +sys_access 1 +---- + +Basically our task is to keep a per-syscall tally that gets updated +every time a system call occurs in the system. Our script will do +that, but first we need to record the data that will be processed by +that script. Theoretically, there are a couple of ways we could do +that: + +- we could enable every event under the tracing/events/syscalls + directory, but this is over 600 syscalls, well beyond the number + allowable by perf. These individual syscall events will however be + useful if we want to later use the guidance we get from the + general-purpose scripts to drill down and get more detail about + individual syscalls of interest. + +- we can enable the sys_enter and/or sys_exit syscalls found under + tracing/events/raw_syscalls. These are called for all syscalls; the + 'id' field can be used to distinguish between individual syscall + numbers. + +For this script, we only need to know that a syscall was entered; we +don't care how it exited, so we'll use 'perf record' to record only +the sys_enter events: + +---- +# perf record -a -e raw_syscalls:sys_enter + +^C[ perf record: Woken up 1 times to write data ] +[ perf record: Captured and wrote 56.545 MB perf.data (~2470503 samples) ] +---- + +The options basically say to collect data for every syscall event +system-wide and multiplex the per-cpu output into a single stream. +That single stream will be recorded in a file in the current directory +called perf.data. + +Once we have a perf.data file containing our data, we can use the -g +'perf script' option to generate a Python script that will contain a +callback handler for each event type found in the perf.data trace +stream (for more details, see the STARTER SCRIPTS section). + +---- +# perf script -g python +generated Python script: perf-script.py + +The output file created also in the current directory is named +perf-script.py. Here's the file in its entirety: + +# perf script event handlers, generated by perf script -g python +# Licensed under the terms of the GNU GPL License version 2 + +# The common_* event handler fields are the most useful fields common to +# all events. They don't necessarily correspond to the 'common_*' fields +# in the format files. Those fields not available as handler params can +# be retrieved using Python functions of the form common_*(context). +# See the perf-script-python Documentation for the list of available functions. + +import os +import sys + +sys.path.append(os.environ['PERF_EXEC_PATH'] + \ + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + +from perf_trace_context import * +from Core import * + +def trace_begin(): + print "in trace_begin" + +def trace_end(): + print "in trace_end" + +def raw_syscalls__sys_enter(event_name, context, common_cpu, + common_secs, common_nsecs, common_pid, common_comm, + id, args): + print_header(event_name, common_cpu, common_secs, common_nsecs, + common_pid, common_comm) + + print "id=%d, args=%s\n" % \ + (id, args), + +def trace_unhandled(event_name, context, common_cpu, common_secs, common_nsecs, + common_pid, common_comm): + print_header(event_name, common_cpu, common_secs, common_nsecs, + common_pid, common_comm) + +def print_header(event_name, cpu, secs, nsecs, pid, comm): + print "%-20s %5u %05u.%09u %8u %-20s " % \ + (event_name, cpu, secs, nsecs, pid, comm), +---- + +At the top is a comment block followed by some import statements and a +path append which every perf script script should include. + +Following that are a couple generated functions, trace_begin() and +trace_end(), which are called at the beginning and the end of the +script respectively (for more details, see the SCRIPT_LAYOUT section +below). + +Following those are the 'event handler' functions generated one for +every event in the 'perf record' output. The handler functions take +the form subsystem__event_name, and contain named parameters, one for +each field in the event; in this case, there's only one event, +raw_syscalls__sys_enter(). (see the EVENT HANDLERS section below for +more info on event handlers). + +The final couple of functions are, like the begin and end functions, +generated for every script. The first, trace_unhandled(), is called +every time the script finds an event in the perf.data file that +doesn't correspond to any event handler in the script. This could +mean either that the record step recorded event types that it wasn't +really interested in, or the script was run against a trace file that +doesn't correspond to the script. + +The script generated by -g option simply prints a line for each +event found in the trace stream i.e. it basically just dumps the event +and its parameter values to stdout. The print_header() function is +simply a utility function used for that purpose. Let's rename the +script and run it to see the default output: + +---- +# mv perf-script.py syscall-counts.py +# perf script -s syscall-counts.py + +raw_syscalls__sys_enter 1 00840.847582083 7506 perf id=1, args= +raw_syscalls__sys_enter 1 00840.847595764 7506 perf id=1, args= +raw_syscalls__sys_enter 1 00840.847620860 7506 perf id=1, args= +raw_syscalls__sys_enter 1 00840.847710478 6533 npviewer.bin id=78, args= +raw_syscalls__sys_enter 1 00840.847719204 6533 npviewer.bin id=142, args= +raw_syscalls__sys_enter 1 00840.847755445 6533 npviewer.bin id=3, args= +raw_syscalls__sys_enter 1 00840.847775601 6533 npviewer.bin id=3, args= +raw_syscalls__sys_enter 1 00840.847781820 6533 npviewer.bin id=3, args= +. +. +. +---- + +Of course, for this script, we're not interested in printing every +trace event, but rather aggregating it in a useful way. So we'll get +rid of everything to do with printing as well as the trace_begin() and +trace_unhandled() functions, which we won't be using. That leaves us +with this minimalistic skeleton: + +---- +import os +import sys + +sys.path.append(os.environ['PERF_EXEC_PATH'] + \ + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + +from perf_trace_context import * +from Core import * + +def trace_end(): + print "in trace_end" + +def raw_syscalls__sys_enter(event_name, context, common_cpu, + common_secs, common_nsecs, common_pid, common_comm, + id, args): +---- + +In trace_end(), we'll simply print the results, but first we need to +generate some results to print. To do that we need to have our +sys_enter() handler do the necessary tallying until all events have +been counted. A hash table indexed by syscall id is a good way to +store that information; every time the sys_enter() handler is called, +we simply increment a count associated with that hash entry indexed by +that syscall id: + +---- + syscalls = autodict() + + try: + syscalls[id] += 1 + except TypeError: + syscalls[id] = 1 +---- + +The syscalls 'autodict' object is a special kind of Python dictionary +(implemented in Core.py) that implements Perl's 'autovivifying' hashes +in Python i.e. with autovivifying hashes, you can assign nested hash +values without having to go to the trouble of creating intermediate +levels if they don't exist e.g syscalls[comm][pid][id] = 1 will create +the intermediate hash levels and finally assign the value 1 to the +hash entry for 'id' (because the value being assigned isn't a hash +object itself, the initial value is assigned in the TypeError +exception. Well, there may be a better way to do this in Python but +that's what works for now). + +Putting that code into the raw_syscalls__sys_enter() handler, we +effectively end up with a single-level dictionary keyed on syscall id +and having the counts we've tallied as values. + +The print_syscall_totals() function iterates over the entries in the +dictionary and displays a line for each entry containing the syscall +name (the dictonary keys contain the syscall ids, which are passed to +the Util function syscall_name(), which translates the raw syscall +numbers to the corresponding syscall name strings). The output is +displayed after all the events in the trace have been processed, by +calling the print_syscall_totals() function from the trace_end() +handler called at the end of script processing. + +The final script producing the output shown above is shown in its +entirety below (syscall_name() helper is not yet available, you can +only deal with id's for now): + +---- +import os +import sys + +sys.path.append(os.environ['PERF_EXEC_PATH'] + \ + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + +from perf_trace_context import * +from Core import * +from Util import * + +syscalls = autodict() + +def trace_end(): + print_syscall_totals() + +def raw_syscalls__sys_enter(event_name, context, common_cpu, + common_secs, common_nsecs, common_pid, common_comm, + id, args): + try: + syscalls[id] += 1 + except TypeError: + syscalls[id] = 1 + +def print_syscall_totals(): + if for_comm is not None: + print "\nsyscall events for %s:\n\n" % (for_comm), + else: + print "\nsyscall events:\n\n", + + print "%-40s %10s\n" % ("event", "count"), + print "%-40s %10s\n" % ("----------------------------------------", \ + "-----------"), + + for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \ + reverse = True): + print "%-40s %10d\n" % (syscall_name(id), val), +---- + +The script can be run just as before: + + # perf script -s syscall-counts.py + +So those are the essential steps in writing and running a script. The +process can be generalized to any tracepoint or set of tracepoints +you're interested in - basically find the tracepoint(s) you're +interested in by looking at the list of available events shown by +'perf list' and/or look in /sys/kernel/debug/tracing events for +detailed event and field info, record the corresponding trace data +using 'perf record', passing it the list of interesting events, +generate a skeleton script using 'perf script -g python' and modify the +code to aggregate and display it for your particular needs. + +After you've done that you may end up with a general-purpose script +that you want to keep around and have available for future use. By +writing a couple of very simple shell scripts and putting them in the +right place, you can have your script listed alongside the other +scripts listed by the 'perf script -l' command e.g.: + +---- +root@tropicana:~# perf script -l +List of available trace scripts: + wakeup-latency system-wide min/max/avg wakeup latency + rw-by-file r/w activity for a program, by file + rw-by-pid system-wide r/w activity +---- + +A nice side effect of doing this is that you also then capture the +probably lengthy 'perf record' command needed to record the events for +the script. + +To have the script appear as a 'built-in' script, you write two simple +scripts, one for recording and one for 'reporting'. + +The 'record' script is a shell script with the same base name as your +script, but with -record appended. The shell script should be put +into the perf/scripts/python/bin directory in the kernel source tree. +In that script, you write the 'perf record' command-line needed for +your script: + +---- +# cat kernel-source/tools/perf/scripts/python/bin/syscall-counts-record + +#!/bin/bash +perf record -a -e raw_syscalls:sys_enter +---- + +The 'report' script is also a shell script with the same base name as +your script, but with -report appended. It should also be located in +the perf/scripts/python/bin directory. In that script, you write the +'perf script -s' command-line needed for running your script: + +---- +# cat kernel-source/tools/perf/scripts/python/bin/syscall-counts-report + +#!/bin/bash +# description: system-wide syscall counts +perf script -s ~/libexec/perf-core/scripts/python/syscall-counts.py +---- + +Note that the location of the Python script given in the shell script +is in the libexec/perf-core/scripts/python directory - this is where +the script will be copied by 'make install' when you install perf. +For the installation to install your script there, your script needs +to be located in the perf/scripts/python directory in the kernel +source tree: + +---- +# ls -al kernel-source/tools/perf/scripts/python + +root@tropicana:/home/trz/src/tip# ls -al tools/perf/scripts/python +total 32 +drwxr-xr-x 4 trz trz 4096 2010-01-26 22:30 . +drwxr-xr-x 4 trz trz 4096 2010-01-26 22:29 .. +drwxr-xr-x 2 trz trz 4096 2010-01-26 22:29 bin +-rw-r--r-- 1 trz trz 2548 2010-01-26 22:29 check-perf-script.py +drwxr-xr-x 3 trz trz 4096 2010-01-26 22:49 Perf-Trace-Util +-rw-r--r-- 1 trz trz 1462 2010-01-26 22:30 syscall-counts.py +---- + +Once you've done that (don't forget to do a new 'make install', +otherwise your script won't show up at run-time), 'perf script -l' +should show a new entry for your script: + +---- +root@tropicana:~# perf script -l +List of available trace scripts: + wakeup-latency system-wide min/max/avg wakeup latency + rw-by-file r/w activity for a program, by file + rw-by-pid system-wide r/w activity + syscall-counts system-wide syscall counts +---- + +You can now perform the record step via 'perf script record': + + # perf script record syscall-counts + +and display the output using 'perf script report': + + # perf script report syscall-counts + +STARTER SCRIPTS +--------------- + +You can quickly get started writing a script for a particular set of +trace data by generating a skeleton script using 'perf script -g +python' in the same directory as an existing perf.data trace file. +That will generate a starter script containing a handler for each of +the event types in the trace file; it simply prints every available +field for each event in the trace file. + +You can also look at the existing scripts in +~/libexec/perf-core/scripts/python for typical examples showing how to +do basic things like aggregate event data, print results, etc. Also, +the check-perf-script.py script, while not interesting for its results, +attempts to exercise all of the main scripting features. + +EVENT HANDLERS +-------------- + +When perf script is invoked using a trace script, a user-defined +'handler function' is called for each event in the trace. If there's +no handler function defined for a given event type, the event is +ignored (or passed to a 'trace_handled' function, see below) and the +next event is processed. + +Most of the event's field values are passed as arguments to the +handler function; some of the less common ones aren't - those are +available as calls back into the perf executable (see below). + +As an example, the following perf record command can be used to record +all sched_wakeup events in the system: + + # perf record -a -e sched:sched_wakeup + +Traces meant to be processed using a script should be recorded with +the above option: -a to enable system-wide collection. + +The format file for the sched_wakep event defines the following fields +(see /sys/kernel/debug/tracing/events/sched/sched_wakeup/format): + +---- + format: + field:unsigned short common_type; + field:unsigned char common_flags; + field:unsigned char common_preempt_count; + field:int common_pid; + + field:char comm[TASK_COMM_LEN]; + field:pid_t pid; + field:int prio; + field:int success; + field:int target_cpu; +---- + +The handler function for this event would be defined as: + +---- +def sched__sched_wakeup(event_name, context, common_cpu, common_secs, + common_nsecs, common_pid, common_comm, + comm, pid, prio, success, target_cpu): + pass +---- + +The handler function takes the form subsystem__event_name. + +The common_* arguments in the handler's argument list are the set of +arguments passed to all event handlers; some of the fields correspond +to the common_* fields in the format file, but some are synthesized, +and some of the common_* fields aren't common enough to to be passed +to every event as arguments but are available as library functions. + +Here's a brief description of each of the invariant event args: + + event_name the name of the event as text + context an opaque 'cookie' used in calls back into perf + common_cpu the cpu the event occurred on + common_secs the secs portion of the event timestamp + common_nsecs the nsecs portion of the event timestamp + common_pid the pid of the current task + common_comm the name of the current process + +All of the remaining fields in the event's format file have +counterparts as handler function arguments of the same name, as can be +seen in the example above. + +The above provides the basics needed to directly access every field of +every event in a trace, which covers 90% of what you need to know to +write a useful trace script. The sections below cover the rest. + +SCRIPT LAYOUT +------------- + +Every perf script Python script should start by setting up a Python +module search path and 'import'ing a few support modules (see module +descriptions below): + +---- + import os + import sys + + sys.path.append(os.environ['PERF_EXEC_PATH'] + \ + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + + from perf_trace_context import * + from Core import * +---- + +The rest of the script can contain handler functions and support +functions in any order. + +Aside from the event handler functions discussed above, every script +can implement a set of optional functions: + +*trace_begin*, if defined, is called before any event is processed and +gives scripts a chance to do setup tasks: + +---- +def trace_begin: + pass +---- + +*trace_end*, if defined, is called after all events have been + processed and gives scripts a chance to do end-of-script tasks, such + as display results: + +---- +def trace_end: + pass +---- + +*trace_unhandled*, if defined, is called after for any event that + doesn't have a handler explicitly defined for it. The standard set + of common arguments are passed into it: + +---- +def trace_unhandled(event_name, context, common_cpu, common_secs, + common_nsecs, common_pid, common_comm): + pass +---- + +The remaining sections provide descriptions of each of the available +built-in perf script Python modules and their associated functions. + +AVAILABLE MODULES AND FUNCTIONS +------------------------------- + +The following sections describe the functions and variables available +via the various perf script Python modules. To use the functions and +variables from the given module, add the corresponding 'from XXXX +import' line to your perf script script. + +Core.py Module +~~~~~~~~~~~~~~ + +These functions provide some essential functions to user scripts. + +The *flag_str* and *symbol_str* functions provide human-readable +strings for flag and symbolic fields. These correspond to the strings +and values parsed from the 'print fmt' fields of the event format +files: + + flag_str(event_name, field_name, field_value) - returns the string represention corresponding to field_value for the flag field field_name of event event_name + symbol_str(event_name, field_name, field_value) - returns the string represention corresponding to field_value for the symbolic field field_name of event event_name + +The *autodict* function returns a special kind of Python +dictionary that implements Perl's 'autovivifying' hashes in Python +i.e. with autovivifying hashes, you can assign nested hash values +without having to go to the trouble of creating intermediate levels if +they don't exist. + + autodict() - returns an autovivifying dictionary instance + + +perf_trace_context Module +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Some of the 'common' fields in the event format file aren't all that +common, but need to be made accessible to user scripts nonetheless. + +perf_trace_context defines a set of functions that can be used to +access this data in the context of the current event. Each of these +functions expects a context variable, which is the same as the +context variable passed into every event handler as the second +argument. + + common_pc(context) - returns common_preempt count for the current event + common_flags(context) - returns common_flags for the current event + common_lock_depth(context) - returns common_lock_depth for the current event + +Util.py Module +~~~~~~~~~~~~~~ + +Various utility functions for use with perf script: + + nsecs(secs, nsecs) - returns total nsecs given secs/nsecs pair + nsecs_secs(nsecs) - returns whole secs portion given nsecs + nsecs_nsecs(nsecs) - returns nsecs remainder given nsecs + nsecs_str(nsecs) - returns printable string in the form secs.nsecs + avg(total, n) - returns average given a sum and a total number of values + +SEE ALSO +-------- +linkperf:perf-script[1] diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt new file mode 100644 index 00000000..e9cbfcdd --- /dev/null +++ b/tools/perf/Documentation/perf-script.txt @@ -0,0 +1,209 @@ +perf-script(1) +============= + +NAME +---- +perf-script - Read perf.data (created by perf record) and display trace output + +SYNOPSIS +-------- +[verse] +'perf script' [] +'perf script' [] record