bug 559228 - Update Breakpad to r652
authorTed Mielczarek <ted.mielczarek@gmail.com>
Mon, 16 Aug 2010 15:05:08 -0400
changeset 50677 22568ff8773cd7cf1ff0b5913265bb70c05e960a
parent 50676 7ad51f9290e83ae0c67903d779a76becf37154ea
child 50678 e93e3a3d3a6c969670c9eee7a7cb1eb59b4bd6df
push idunknown
push userunknown
push dateunknown
bugs559228
milestone2.0b4pre
bug 559228 - Update Breakpad to r652
toolkit/crashreporter/google-breakpad/.hg_archival.txt
toolkit/crashreporter/google-breakpad/.hgsvnexternals
toolkit/crashreporter/google-breakpad/README
toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.cc
toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc
toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_extension_linux.h
toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc
toolkit/crashreporter/google-breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj
toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.h
toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.mm
toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.mm
toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.mm
toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/client_info.h
toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_client.cc
toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_client.h
toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_server.cc
toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_server.h
toolkit/crashreporter/google-breakpad/src/client/mac/handler/breakpad_nlist_64.cc
toolkit/crashreporter/google-breakpad/src/client/mac/handler/dynamic_images.cc
toolkit/crashreporter/google-breakpad/src/client/mac/handler/dynamic_images.h
toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.cc
toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.h
toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler_test.cc
toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.cc
toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj
toolkit/crashreporter/google-breakpad/src/client/mac/handler/protected_memory_allocator.cc
toolkit/crashreporter/google-breakpad/src/client/mac/handler/protected_memory_allocator.h
toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.h
toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.m
toolkit/crashreporter/google-breakpad/src/client/mac/sender/da.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/da.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/de.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/de.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/es.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/es.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/fr.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/fr.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/it.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/it.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/ja.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/ja.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/nl.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/nl.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/no.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/no.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/sl.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/sl.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/sv.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/sv.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/tr.lproj/InfoPlist.strings
toolkit/crashreporter/google-breakpad/src/client/mac/sender/tr.lproj/Localizable.strings
toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.m
toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.xib
toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.mm
toolkit/crashreporter/google-breakpad/src/client/mac/tests/SimpleStringDictionaryTest.h
toolkit/crashreporter/google-breakpad/src/client/mac/tests/auto_tempdir.h
toolkit/crashreporter/google-breakpad/src/client/mac/tests/crash_generation_server_test.cc
toolkit/crashreporter/google-breakpad/src/client/mac/tests/exception_handler_test.cc
toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer-inl.h
toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer.cc
toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer.h
toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer_unittest.cc
toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader.cc
toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader.h
toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader.cc
toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader.h
toolkit/crashreporter/google-breakpad/src/common/dwarf/line_state_machine.h
toolkit/crashreporter/google-breakpad/src/common/dwarf_cfi_to_module.cc
toolkit/crashreporter/google-breakpad/src/common/dwarf_cfi_to_module.h
toolkit/crashreporter/google-breakpad/src/common/dwarf_cu_to_module.cc
toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc
toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.h
toolkit/crashreporter/google-breakpad/src/common/linux/memory.h
toolkit/crashreporter/google-breakpad/src/common/mac/Breakpad.xcconfig
toolkit/crashreporter/google-breakpad/src/common/mac/BreakpadDebug.xcconfig
toolkit/crashreporter/google-breakpad/src/common/mac/BreakpadRelease.xcconfig
toolkit/crashreporter/google-breakpad/src/common/mac/HTTPMultipartUpload.m
toolkit/crashreporter/google-breakpad/src/common/mac/MachIPC.h
toolkit/crashreporter/google-breakpad/src/common/mac/MachIPC.mm
toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.h
toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.mm
toolkit/crashreporter/google-breakpad/src/common/mac/macho_id.cc
toolkit/crashreporter/google-breakpad/src/common/mac/macho_id.h
toolkit/crashreporter/google-breakpad/src/common/mac/macho_reader.cc
toolkit/crashreporter/google-breakpad/src/common/mac/macho_reader_unittest.cc
toolkit/crashreporter/google-breakpad/src/common/mac/macho_walker.cc
toolkit/crashreporter/google-breakpad/src/common/mac/macho_walker.h
toolkit/crashreporter/google-breakpad/src/common/mac/scoped_task_suspend-inl.h
toolkit/crashreporter/google-breakpad/src/common/mac/string_utilities.cc
toolkit/crashreporter/google-breakpad/src/common/module.cc
toolkit/crashreporter/google-breakpad/src/common/module.h
toolkit/crashreporter/google-breakpad/src/common/module_unittest.cc
toolkit/crashreporter/google-breakpad/src/common/stabs_to_module.cc
toolkit/crashreporter/google-breakpad/src/common/stabs_to_module_unittest.cc
toolkit/crashreporter/google-breakpad/src/common/string_conversion.cc
toolkit/crashreporter/google-breakpad/src/common/test_assembler.cc
toolkit/crashreporter/google-breakpad/src/common/test_assembler_unittest.cc
toolkit/crashreporter/google-breakpad/src/processor/minidump_unittest.cc
toolkit/crashreporter/google-breakpad/src/processor/stackwalker_amd64_unittest.cc
toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm_unittest.cc
toolkit/crashreporter/google-breakpad/src/processor/stackwalker_sparc.cc
toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86_unittest.cc
toolkit/crashreporter/google-breakpad/src/processor/synth_minidump.cc
toolkit/crashreporter/google-breakpad/src/processor/synth_minidump.h
toolkit/crashreporter/google-breakpad/src/processor/synth_minidump_unittest.cc
toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/dump_syms.cc
toolkit/crashreporter/google-breakpad/src/tools/linux/md2core/minidump-2-core.cc
toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj
toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.mm
toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/macho_dump.cc
toolkit/crashreporter/google-breakpad/src/tools/mac/symupload/minidump_upload.m
toolkit/crashreporter/google-breakpad/src/tools/mac/symupload/symupload.m
toolkit/crashreporter/google-breakpad/src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/.hg_archival.txt
@@ -0,0 +1,5 @@
+repo: aa80aeafa44f5c17c84e1dac5a7119a6d1ef4341
+node: 2645d42a92c4144ec095d774a32d2fcaec1afa0b
+branch: default
+latesttag: null
+latesttagdistance: 581
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/.hgsvnexternals
@@ -0,0 +1,7 @@
+[.]
+ src/testing -r175 http://googlemock.googlecode.com/svn/trunk/
+ src/tools/gyp -r762 http://gyp.googlecode.com/svn/trunk
+[src/third_party/glog]
+ glog http://google-glog.googlecode.com/svn/trunk
+[src/third_party/protobuf]
+ protobuf http://protobuf.googlecode.com/svn/trunk
--- a/toolkit/crashreporter/google-breakpad/README
+++ b/toolkit/crashreporter/google-breakpad/README
@@ -1,2 +1,43 @@
 Breakpad is a set of client and server components which implement a
 crash-reporting system.
+
+
+-----
+Getting started in 32-bit mode (from trunk)
+Configure: CXXFLAGS=-m32 CFLAGS=-m32 CPPFLAGS=-m32 ./configure
+    Build: make
+     Test: make check
+  Install: make install
+
+If you need to reconfigure your build be sure to run "make distclean" first.
+
+
+-----
+To request change review:
+0. Get access to a read-write copy of source.
+   Owners at http://code.google.com/p/google-breakpad/ are able to grant
+   this access.
+
+1. Check out a read-write copy of source using instructions at
+   http://code.google.com/p/google-breakpad/source/checkout
+
+2. Make changes. Build and test your changes.
+   For core code like processor use methods above.
+   For linux/mac/windows, there are test targets in each project file.
+
+3. Download http://codereview.appspot.com/static/upload.py
+
+4. Run upload.py from the 'src' directory:
+   upload.py --server=breakpad.appspot.com
+
+   You will be prompted for credential and a description.
+
+5. At http://breakpad.appspot.com you'll find your issue listed; click on it,
+   and select Publish+Mail, and enter in the code reviewer and CC
+   google-breakpad-dev@googlegroups.com
+
+6. When applying code review feedback, specify the '-i' option when running
+   upload.py again and pass the issue number so it updates the existing issue,
+   rather than creating a new one.
+   Be sure to rerun upload.py from the same directory as you did for previous
+   uploads to allow for proper diff calculations.
--- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.cc
+++ b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.cc
@@ -67,16 +67,17 @@
 
 #include <errno.h>
 #include <fcntl.h>
 #include <linux/limits.h>
 #include <sched.h>
 #include <signal.h>
 #include <stdio.h>
 #include <sys/mman.h>
+#include <sys/prctl.h>
 #include <sys/signal.h>
 #include <sys/syscall.h>
 #include <sys/ucontext.h>
 #include <sys/user.h>
 #include <sys/wait.h>
 #include <ucontext.h>
 #include <unistd.h>
 
@@ -263,17 +264,20 @@ void ExceptionHandler::SignalHandler(int
   }
 
   pthread_mutex_unlock(&handler_stack_mutex_);
 
   // Terminate ourselves with the same signal so that our parent knows that we
   // crashed. The default action for all the signals which we catch is Core, so
   // this is the end of us.
   signal(sig, SIG_DFL);
-  tgkill(getpid(), sys_gettid(), sig);
+
+  // TODO(markus): mask signal and return to caller
+  tgkill(getpid(), syscall(__NR_gettid), sig);
+  _exit(1);
 
   // not reached.
 }
 
 struct ThreadArgument {
   pid_t pid;  // the crashing process
   ExceptionHandler* handler;
   const void* context;  // a CrashContext structure
@@ -291,30 +295,30 @@ int ExceptionHandler::ThreadEntry(void *
 
 // This function runs in a compromised context: see the top of the file.
 // Runs on the crashing thread.
 bool ExceptionHandler::HandleSignal(int sig, siginfo_t* info, void* uc) {
   if (filter_ && !filter_(callback_context_))
     return false;
 
   // Allow ourselves to be dumped.
-  sys_prctl(PR_SET_DUMPABLE, 1);
+  prctl(PR_SET_DUMPABLE, 1);
   CrashContext context;
   memcpy(&context.siginfo, info, sizeof(siginfo_t));
   memcpy(&context.context, uc, sizeof(struct ucontext));
 #if !defined(__ARM_EABI__)
   // FP state is not part of user ABI on ARM Linux.
   struct ucontext *uc_ptr = (struct ucontext*)uc;
   if (uc_ptr->uc_mcontext.fpregs) {
     memcpy(&context.float_state,
            uc_ptr->uc_mcontext.fpregs,
            sizeof(context.float_state));
   }
 #endif
-  context.tid = sys_gettid();
+  context.tid = syscall(__NR_gettid);
   if (crash_handler_ != NULL) {
     if (crash_handler_(&context, sizeof(context),
                        callback_context_)) {
       return true;
     }
   }
   return GenerateDump(&context);
 }
--- a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc
+++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc
@@ -71,16 +71,36 @@ bool AttachThread(pid_t pid) {
     return false;
   }
   while (sys_waitpid(pid, NULL, __WALL) < 0) {
     if (errno != EINTR) {
       sys_ptrace(PTRACE_DETACH, pid, NULL, NULL);
       return false;
     }
   }
+#if defined(__i386) || defined(__x86_64)
+  // On x86, the stack pointer is NULL or -1, when executing trusted code in
+  // the seccomp sandbox. Not only does this cause difficulties down the line
+  // when trying to dump the thread's stack, it also results in the minidumps
+  // containing information about the trusted threads. This information is
+  // generally completely meaningless and just pollutes the minidumps.
+  // We thus test the stack pointer and exclude any threads that are part of
+  // the seccomp sandbox's trusted code.
+  user_regs_struct regs;
+  if (sys_ptrace(PTRACE_GETREGS, pid, NULL, &regs) == -1 ||
+#if defined(__i386)
+      !regs.esp
+#elif defined(__x86_64)
+      !regs.rsp
+#endif
+      ) {
+    sys_ptrace(PTRACE_DETACH, pid, NULL, NULL);
+    return false;
+  }
+#endif
   return true;
 }
 
 bool DetachThread(pid_t pid) {
   return sys_ptrace(PTRACE_DETACH, pid, NULL, NULL) >= 0;
 }
 
 inline bool IsMappedFileOpenUnsafe(
@@ -133,21 +153,29 @@ LinuxDumper::LinuxDumper(int pid)
 bool LinuxDumper::Init() {
   return EnumerateThreads(&threads_) &&
          EnumerateMappings(&mappings_);
 }
 
 bool LinuxDumper::ThreadsAttach() {
   if (threads_suspended_)
     return true;
-  bool good = true;
-  for (size_t i = 0; i < threads_.size(); ++i)
-    good &= AttachThread(threads_[i]);
+  for (size_t i = 0; i < threads_.size(); ++i) {
+    if (!AttachThread(threads_[i])) {
+      // If the thread either disappeared before we could attach to it, or if
+      // it was part of the seccomp sandbox's trusted code, it is OK to
+      // silently drop it from the minidump.
+      memmove(&threads_[i], &threads_[i+1],
+              (threads_.size() - i - 1) * sizeof(threads_[i]));
+      threads_.resize(threads_.size() - 1);
+      --i;
+    }
+  }
   threads_suspended_ = true;
-  return good;
+  return threads_.size() > 0;
 }
 
 bool LinuxDumper::ThreadsDetach() {
   if (!threads_suspended_)
     return false;
   bool good = true;
   for (size_t i = 0; i < threads_.size(); ++i)
     good &= DetachThread(threads_[i]);
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_extension_linux.h
@@ -0,0 +1,74 @@
+/* Copyright (c) 2010, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
+
+/* minidump_extension_linux.h: A definition of exception codes for
+ * Linux
+ *
+ * (This is C99 source, please don't corrupt it with C++.)
+ *
+ * Author: Adam Langley
+ * Split into its own file: Markus Gutschke */
+
+
+#ifndef SRC_CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_EXTENSION_LINUX_H_
+#define SRC_CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_EXTENSION_LINUX_H_
+
+#include <stddef.h>
+
+#include "google_breakpad/common/breakpad_types.h"
+
+// These are additional minidump stream values which are specific to the linux
+// breakpad implementation.
+enum {
+  MD_LINUX_CPU_INFO              = 0x47670003,    /* /proc/cpuinfo    */
+  MD_LINUX_PROC_STATUS           = 0x47670004,    /* /proc/$x/status  */
+  MD_LINUX_LSB_RELEASE           = 0x47670005,    /* /etc/lsb-release */
+  MD_LINUX_CMD_LINE              = 0x47670006,    /* /proc/$x/cmdline */
+  MD_LINUX_ENVIRON               = 0x47670007,    /* /proc/$x/environ */
+  MD_LINUX_AUXV                  = 0x47670008,    /* /proc/$x/auxv    */
+  MD_LINUX_MAPS                  = 0x47670009,    /* /proc/$x/maps    */
+  MD_LINUX_DSO_DEBUG             = 0x4767000A     /* DSO data         */
+};
+
+typedef struct {
+  void*     addr;
+  MDRVA     name;
+  void*     ld;
+} MDRawLinkMap;
+
+typedef struct {
+  u_int32_t version;
+  MDRVA     map;
+  u_int32_t dso_count;
+  void*     brk;
+  void*     ldbase;
+  void*     dynamic;
+} MDRawDebug;
+
+#endif  // SRC_CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_EXTENSION_LINUX_H_
--- a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc
+++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc
@@ -43,46 +43,37 @@
 //     a canonical instance in the LinuxDumper object. We use the placement
 //     new form to allocate objects and we don't delete them.
 
 #include "client/linux/minidump_writer/minidump_writer.h"
 #include "client/minidump_file_writer-inl.h"
 
 #include <errno.h>
 #include <fcntl.h>
+#include <link.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/ucontext.h>
 #include <sys/user.h>
 #include <sys/utsname.h>
 
 #include "client/minidump_file_writer.h"
 #include "google_breakpad/common/minidump_format.h"
 #include "google_breakpad/common/minidump_cpu_amd64.h"
 #include "google_breakpad/common/minidump_cpu_x86.h"
 
 #include "client/linux/handler/exception_handler.h"
 #include "client/linux/minidump_writer/line_reader.h"
 #include "client/linux/minidump_writer/linux_dumper.h"
+#include "client/linux/minidump_writer/minidump_extension_linux.h"
 #include "common/linux/linux_libc_support.h"
 #include "common/linux/linux_syscall_support.h"
 
 using google_breakpad::ThreadInfo;
 
-// These are additional minidump stream values which are specific to the linux
-// breakpad implementation.
-enum {
-  MD_LINUX_CPU_INFO              = 0x47670003,    /* /proc/cpuinfo    */
-  MD_LINUX_PROC_STATUS           = 0x47670004,    /* /proc/$x/status  */
-  MD_LINUX_LSB_RELEASE           = 0x47670005,    /* /etc/lsb-release */
-  MD_LINUX_CMD_LINE              = 0x47670006,    /* /proc/$x/cmdline */
-  MD_LINUX_ENVIRON               = 0x47670007,    /* /proc/$x/environ */
-  MD_LINUX_AUXV                  = 0x47670008     /* /proc/$x/auxv    */
-};
-
 // Minidump defines register structures which are different from the raw
 // structures which we get from the kernel. These are platform specific
 // functions to juggle the ucontext and user structures into minidump format.
 #if defined(__i386)
 typedef MDRawContextX86 RawContextCPU;
 
 // Write a uint16_t to memory
 //   out: memory location to write to
@@ -452,19 +443,36 @@ class MinidumpWriter {
     dumper_.ThreadsDetach();
   }
 
   bool HaveCrashedThread() const {
     return ucontext_ != NULL;
   }
 
   bool Dump() {
+    // The dynamic linker makes information available that helps gdb find all
+    // DSOs loaded into the program. If we can access this information, we dump
+    // it to a MD_LINUX_DSO_DEBUG stream.
+    struct r_debug* r_debug = NULL;
+    uint32_t dynamic_length = 0;
+
+    for (int i = 0;;) {
+      ElfW(Dyn) dyn;
+      dynamic_length += sizeof(dyn);
+      dumper_.CopyFromProcess(&dyn, crashing_tid_, _DYNAMIC+i++, sizeof(dyn));
+      if (dyn.d_tag == DT_DEBUG) {
+        r_debug = (struct r_debug*)dyn.d_un.d_ptr;
+        continue;
+      } else if (dyn.d_tag == DT_NULL)
+        break;
+    }
+
     // A minidump file contains a number of tagged streams. This is the number
     // of stream which we write.
-    static const unsigned kNumWriters = 11;
+    const unsigned kNumWriters = 11 + !!r_debug;
 
     TypedMDRVA<MDRawHeader> header(&minidump_writer_);
     TypedMDRVA<MDRawDirectory> dir(&minidump_writer_);
     if (!header.Allocate())
       return false;
     if (!dir.AllocateArray(kNumWriters))
       return false;
     memset(header.get(), 0, sizeof(MDRawHeader));
@@ -521,28 +529,152 @@ class MinidumpWriter {
       NullifyDirectoryEntry(&dirent);
     dir.CopyIndex(dir_index++, &dirent);
 
     dirent.stream_type = MD_LINUX_AUXV;
     if (!WriteProcFile(&dirent.location, crashing_tid_, "auxv"))
       NullifyDirectoryEntry(&dirent);
     dir.CopyIndex(dir_index++, &dirent);
 
-    dirent.stream_type = MD_LINUX_AUXV;
+    dirent.stream_type = MD_LINUX_MAPS;
     if (!WriteProcFile(&dirent.location, crashing_tid_, "maps"))
       NullifyDirectoryEntry(&dirent);
     dir.CopyIndex(dir_index++, &dirent);
 
+    if (r_debug) {
+      dirent.stream_type = MD_LINUX_DSO_DEBUG;
+      if (!WriteDSODebugStream(&dirent, r_debug, dynamic_length))
+        NullifyDirectoryEntry(&dirent);
+      dir.CopyIndex(dir_index++, &dirent);
+    }
+
     // If you add more directory entries, don't forget to update kNumWriters,
     // above.
 
     dumper_.ThreadsDetach();
     return true;
   }
 
+  // Check if the top of the stack is part of a system call that has been
+  // redirected by the seccomp sandbox. If so, try to pop the stack frames
+  // all the way back to the point where the interception happened.
+  void PopSeccompStackFrame(RawContextCPU* cpu, const MDRawThread& thread,
+                            uint8_t* stack_copy) {
+#if defined(__x86_64)
+    u_int64_t bp = cpu->rbp;
+    u_int64_t top = thread.stack.start_of_memory_range;
+    for (int i = 4; i--; ) {
+      if (bp < top ||
+          bp + sizeof(bp) > thread.stack.start_of_memory_range +
+          thread.stack.memory.data_size ||
+          bp & 1) {
+        break;
+      }
+      uint64_t old_top = top;
+      top = bp;
+      u_int8_t* bp_addr = stack_copy + bp - thread.stack.start_of_memory_range;
+      memcpy(&bp, bp_addr, sizeof(bp));
+      if (bp == 0xDEADBEEFDEADBEEFull) {
+        struct {
+          uint64_t r15;
+          uint64_t r14;
+          uint64_t r13;
+          uint64_t r12;
+          uint64_t r11;
+          uint64_t r10;
+          uint64_t r9;
+          uint64_t r8;
+          uint64_t rdi;
+          uint64_t rsi;
+          uint64_t rdx;
+          uint64_t rcx;
+          uint64_t rbx;
+          uint64_t deadbeef;
+          uint64_t rbp;
+          uint64_t fakeret;
+          uint64_t ret;
+          /* char redzone[128]; */
+        } seccomp_stackframe;
+        if (top - offsetof(typeof(seccomp_stackframe), deadbeef) < old_top ||
+            top - offsetof(typeof(seccomp_stackframe), deadbeef) +
+            sizeof(seccomp_stackframe) >
+            thread.stack.start_of_memory_range+thread.stack.memory.data_size) {
+          break;
+        }
+        memcpy(&seccomp_stackframe,
+               bp_addr - offsetof(typeof(seccomp_stackframe), deadbeef),
+               sizeof(seccomp_stackframe));
+        cpu->rbx = seccomp_stackframe.rbx;
+        cpu->rcx = seccomp_stackframe.rcx;
+        cpu->rdx = seccomp_stackframe.rdx;
+        cpu->rsi = seccomp_stackframe.rsi;
+        cpu->rdi = seccomp_stackframe.rdi;
+        cpu->rbp = seccomp_stackframe.rbp;
+        cpu->rsp = top + 4*sizeof(uint64_t) + 128;
+        cpu->r8  = seccomp_stackframe.r8;
+        cpu->r9  = seccomp_stackframe.r9;
+        cpu->r10 = seccomp_stackframe.r10;
+        cpu->r11 = seccomp_stackframe.r11;
+        cpu->r12 = seccomp_stackframe.r12;
+        cpu->r13 = seccomp_stackframe.r13;
+        cpu->r14 = seccomp_stackframe.r14;
+        cpu->r15 = seccomp_stackframe.r15;
+        cpu->rip = seccomp_stackframe.fakeret;
+        return;
+      }
+    }
+#elif defined(__i386)
+    u_int32_t bp = cpu->ebp;
+    u_int32_t top = thread.stack.start_of_memory_range;
+    for (int i = 4; i--; ) {
+      if (bp < top ||
+          bp + sizeof(bp) > thread.stack.start_of_memory_range +
+          thread.stack.memory.data_size ||
+          bp & 1) {
+        break;
+      }
+      uint32_t old_top = top;
+      top = bp;
+      u_int8_t* bp_addr = stack_copy + bp - thread.stack.start_of_memory_range;
+      memcpy(&bp, bp_addr, sizeof(bp));
+      if (bp == 0xDEADBEEFu) {
+        struct {
+          uint32_t edi;
+          uint32_t esi;
+          uint32_t edx;
+          uint32_t ecx;
+          uint32_t ebx;
+          uint32_t deadbeef;
+          uint32_t ebp;
+          uint32_t fakeret;
+          uint32_t ret;
+        } seccomp_stackframe;
+        if (top - offsetof(typeof(seccomp_stackframe), deadbeef) < old_top ||
+            top - offsetof(typeof(seccomp_stackframe), deadbeef) +
+            sizeof(seccomp_stackframe) >
+            thread.stack.start_of_memory_range+thread.stack.memory.data_size) {
+          break;
+        }
+        memcpy(&seccomp_stackframe,
+               bp_addr - offsetof(typeof(seccomp_stackframe), deadbeef),
+               sizeof(seccomp_stackframe));
+        cpu->ebx = seccomp_stackframe.ebx;
+        cpu->ecx = seccomp_stackframe.ecx;
+        cpu->edx = seccomp_stackframe.edx;
+        cpu->esi = seccomp_stackframe.esi;
+        cpu->edi = seccomp_stackframe.edi;
+        cpu->ebp = seccomp_stackframe.ebp;
+        cpu->esp = top + 4*sizeof(void*);
+        cpu->eip = seccomp_stackframe.fakeret;
+        return;
+      }
+    }
+#endif
+  }
+
   // Write information about the threads.
   bool WriteThreadListStream(MDRawDirectory* dirent) {
     const unsigned num_threads = dumper_.threads().size();
 
     TypedMDRVA<uint32_t> list(&minidump_writer_);
     if (!list.AllocateObjectAndArray(num_threads, sizeof(MDRawThread)))
       return false;
 
@@ -573,16 +705,17 @@ class MinidumpWriter {
         memory.Copy(stack_copy, stack_len);
         thread.stack.start_of_memory_range = (uintptr_t) (stack);
         thread.stack.memory = memory.location();
         TypedMDRVA<RawContextCPU> cpu(&minidump_writer_);
         if (!cpu.Allocate())
           return false;
         my_memset(cpu.get(), 0, sizeof(RawContextCPU));
         CPUFillFromUContext(cpu.get(), ucontext_, float_state_);
+        PopSeccompStackFrame(cpu.get(), thread, stack_copy);
         thread.thread_context = cpu.location();
         crashing_thread_context_ = cpu.location();
       } else {
         ThreadInfo info;
         info.tid = dumper_.threads()[i];
         if (!dumper_.ThreadInfoGet(&info))
           return false;
         UntypedMDRVA memory(&minidump_writer_);
@@ -595,16 +728,17 @@ class MinidumpWriter {
         memory.Copy(stack_copy, info.stack_len);
         thread.stack.start_of_memory_range = (uintptr_t)(info.stack);
         thread.stack.memory = memory.location();
         TypedMDRVA<RawContextCPU> cpu(&minidump_writer_);
         if (!cpu.Allocate())
           return false;
         my_memset(cpu.get(), 0, sizeof(RawContextCPU));
         CPUFillFromThreadInfo(cpu.get(), info);
+        PopSeccompStackFrame(cpu.get(), thread, stack_copy);
         thread.thread_context = cpu.location();
 
         if ((pid_t)thread.thread_id == crashing_tid_) {
           assert(!HaveCrashedThread());
           // we're dumping a live process and just found the thread
           // that should be "blamed" for the dump.  Grab its PC so we
           // can write it to the exception stream.
           crashing_tid_pc_ = InstructionPointer(info);
@@ -733,16 +867,93 @@ class MinidumpWriter {
     dirent->location = si.location();
 
     WriteCPUInformation(si.get());
     WriteOSInformation(si.get());
 
     return true;
   }
 
+  bool WriteDSODebugStream(MDRawDirectory* dirent, struct r_debug* r_debug,
+                           uint32_t dynamic_length) {
+    // The caller provided us with a pointer to "struct r_debug". We can
+    // look up the "r_map" field to get a linked list of all loaded DSOs.
+    // Our list of DSOs potentially is different from the ones in the crashing
+    // process. So, we have to be careful to never dereference pointers
+    // directly. Instead, we use CopyFromProcess() everywhere.
+    // See <link.h> for a more detailed discussion of the how the dynamic
+    // loader communicates with debuggers.
+
+    // Count the number of loaded DSOs
+    int dso_count = 0;
+    struct r_debug debug_entry;
+    dumper_.CopyFromProcess(&debug_entry, crashing_tid_, r_debug,
+                            sizeof(debug_entry));
+    for (struct link_map* ptr = debug_entry.r_map; ptr; ) {
+      struct link_map map;
+      dumper_.CopyFromProcess(&map, crashing_tid_, ptr, sizeof(map));
+      ptr = map.l_next;
+      dso_count++;
+    }
+
+    MDRVA linkmap_rva = minidump_writer_.kInvalidMDRVA;
+    if (dso_count > 0) {
+      // If we have at least one DSO, create an array of MDRawLinkMap
+      // entries in the minidump file.
+      TypedMDRVA<MDRawLinkMap> linkmap(&minidump_writer_);
+      if (!linkmap.AllocateArray(dso_count))
+        return false;
+      linkmap_rva = linkmap.location().rva;
+      int idx = 0;
+
+      // Iterate over DSOs and write their information to mini dump
+      for (struct link_map* ptr = debug_entry.r_map; ptr; ) {
+        struct link_map map;
+        dumper_.CopyFromProcess(&map, crashing_tid_, ptr, sizeof(map));
+        ptr = map.l_next;
+        char filename[257] = { 0 };
+        if (map.l_name) {
+          dumper_.CopyFromProcess(filename, crashing_tid_, map.l_name,
+                                  sizeof(filename) - 1);
+        }
+        MDLocationDescriptor location;
+        if (!minidump_writer_.WriteString(filename, 0, &location))
+          return false;
+        MDRawLinkMap entry;
+        entry.name = location.rva;
+        entry.addr = (void*)map.l_addr;
+        entry.ld = (void*)map.l_ld;
+        linkmap.CopyIndex(idx++, &entry);
+      }
+    }
+
+    // Write MD_LINUX_DSO_DEBUG record
+    TypedMDRVA<MDRawDebug> debug(&minidump_writer_);
+    if (!debug.AllocateObjectAndArray(1, dynamic_length))
+      return false;
+    my_memset(debug.get(), 0, sizeof(MDRawDebug));
+    dirent->stream_type = MD_LINUX_DSO_DEBUG;
+    dirent->location = debug.location();
+
+    debug.get()->version = debug_entry.r_version;
+    debug.get()->map = linkmap_rva;
+    debug.get()->dso_count = dso_count;
+    debug.get()->brk = (void*)debug_entry.r_brk;
+    debug.get()->ldbase = (void*)debug_entry.r_ldbase;
+    debug.get()->dynamic = (void*)&_DYNAMIC;
+
+    char *dso_debug_data = new char[dynamic_length];
+    dumper_.CopyFromProcess(dso_debug_data, crashing_tid_, &_DYNAMIC,
+                            dynamic_length);
+    debug.CopyIndexAfterObject(0, dso_debug_data, dynamic_length);
+    delete[] dso_debug_data;
+
+    return true;
+  }
+
  private:
   void NullifyDirectoryEntry(MDRawDirectory* dirent) {
     dirent->stream_type = 0;
     dirent->location.data_size = 0;
     dirent->location.rva = 0;
   }
 
   bool WriteCPUInformation(MDRawSystemInfo* sys_info) {
@@ -782,17 +993,17 @@ class MinidumpWriter {
       LineReader* const line_reader = new(allocator) LineReader(fd);
       const char* line;
       unsigned line_len;
       while (line_reader->GetNextLine(&line, &line_len)) {
         for (size_t i = 0;
              i < sizeof(cpu_info_table) / sizeof(cpu_info_table[0]);
              i++) {
           CpuInfoEntry* entry = &cpu_info_table[i];
-          if (entry->found)
+          if (entry->found && i)
             continue;
           if (!strncmp(line, entry->info_name, strlen(entry->info_name))) {
             const char* value = strchr(line, ':');
             if (!value)
               continue;
 
             // the above strncmp only matches the prefix, it might be the wrong
             // line. i.e. we matched "model name" instead of "model".
@@ -868,39 +1079,58 @@ popline:
   bool WriteFile(MDLocationDescriptor* result, const char* filename) {
     const int fd = sys_open(filename, O_RDONLY, 0);
     if (fd < 0)
       return false;
 
     // We can't stat the files because several of the files that we want to
     // read are kernel seqfiles, which always have a length of zero. So we have
     // to read as much as we can into a buffer.
-    static const unsigned kMaxFileSize = 1024;
-    uint8_t* data = (uint8_t*) dumper_.allocator()->Alloc(kMaxFileSize);
+    static const unsigned kBufSize = 1024 - 2*sizeof(void*);
+    struct Buffers {
+      struct Buffers* next;
+      size_t len;
+      uint8_t data[kBufSize];
+    } *buffers =
+        (struct Buffers*) dumper_.allocator()->Alloc(sizeof(struct Buffers));
+    buffers->next = NULL;
+    buffers->len = 0;
 
-    size_t done = 0;
-    while (done < kMaxFileSize) {
+    size_t total = 0;
+    for (struct Buffers* bufptr = buffers;;) {
       ssize_t r;
       do {
-        r = sys_read(fd, data + done, kMaxFileSize - done);
+        r = sys_read(fd, &bufptr->data[bufptr->len], kBufSize - bufptr->len);
       } while (r == -1 && errno == EINTR);
 
       if (r < 1)
         break;
-      done += r;
+      
+      total += r;
+      bufptr->len += r;
+      if (bufptr->len == kBufSize) {
+        bufptr->next =
+          (struct Buffers*) dumper_.allocator()->Alloc(sizeof(struct Buffers));
+        bufptr = bufptr->next;
+        bufptr->next = NULL;
+        bufptr->len = 0;
+      }
     }
     sys_close(fd);
 
-    if (!done)
+    if (!total)
       return false;
 
     UntypedMDRVA memory(&minidump_writer_);
-    if (!memory.Allocate(done))
+    if (!memory.Allocate(total))
       return false;
-    memory.Copy(data, done);
+    for (MDRVA pos = memory.position(); buffers; buffers = buffers->next) {
+      memory.Copy(pos, &buffers->data, buffers->len);
+      pos += buffers->len;
+    }
     *result = memory.location();
     return true;
   }
 
   bool WriteOSInformation(MDRawSystemInfo* sys_info) {
     sys_info->platform_id = MD_OS_LINUX;
 
     struct utsname uts;
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj
@@ -1,14 +1,14 @@
 // !$*UTF8*$!
 {
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 45;
 	objects = {
 
 /* Begin PBXAggregateTarget section */
 		F94585840F782326009A47BF /* All */ = {
 			isa = PBXAggregateTarget;
 			buildConfigurationList = F94585930F78235C009A47BF /* Build configuration list for PBXAggregateTarget "All" */;
 			buildPhases = (
 			);
@@ -17,30 +17,84 @@
 				F945858A0F78232E009A47BF /* PBXTargetDependency */,
 				F945858C0F782330009A47BF /* PBXTargetDependency */,
 				F945858E0F782333009A47BF /* PBXTargetDependency */,
 				F94585900F782336009A47BF /* PBXTargetDependency */,
 				F93DE3A70F830D1D00608B94 /* PBXTargetDependency */,
 				F95BB8B3101F94D300AA053B /* PBXTargetDependency */,
 				F95BB8B5101F94D300AA053B /* PBXTargetDependency */,
 				F95BB8B7101F94D300AA053B /* PBXTargetDependency */,
+				8B31023911F0CF0600FCF3E4 /* PBXTargetDependency */,
+				8B31051711F1010E00FCF3E4 /* PBXTargetDependency */,
+				8B31051911F1010E00FCF3E4 /* PBXTargetDependency */,
+				8B31051B11F1010E00FCF3E4 /* PBXTargetDependency */,
+				8B31051D11F1010E00FCF3E4 /* PBXTargetDependency */,
+				8B31051F11F1010E00FCF3E4 /* PBXTargetDependency */,
 			);
 			name = All;
 			productName = All;
 		};
 /* End PBXAggregateTarget section */
 
 /* Begin PBXBuildFile section */
 		3329D4ED0FA16D820007BBC5 /* Breakpad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3329D4EC0FA16D820007BBC5 /* Breakpad.xib */; };
 		33880C800F9E097100817F82 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 33880C7E0F9E097100817F82 /* InfoPlist.strings */; };
 		4084699D0F5D9CF900FDCA37 /* crash_report_sender.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */; };
+		8B3101C611F0CD9F00FCF3E4 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; };
+		8B3101C711F0CD9F00FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
+		8B3101CA11F0CDB000FCF3E4 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; };
+		8B3101CB11F0CDB000FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
+		8B3101EA11F0CDE300FCF3E4 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B3101E911F0CDE300FCF3E4 /* SenTestingKit.framework */; };
+		8B31029411F0D54300FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
+		8B3102E611F0D74C00FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
+		8B3102EB11F0D78000FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
+		8B31FC8211EFD2B800FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
+		8B4BDAAF12012BC5009C7060 /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4BDAA7120124EA009C7060 /* libcrypto.dylib */; };
+		8B4BDABE12012CEF009C7060 /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4BDAA7120124EA009C7060 /* libcrypto.dylib */; };
+		8B4BDAC512012D05009C7060 /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4BDAA7120124EA009C7060 /* libcrypto.dylib */; };
 		8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; };
+		D24BBBFD121050F000F3D417 /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; };
+		D24BBD291211EDB100F3D417 /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; };
+		D24BBD321212CACF00F3D417 /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; };
 		D2A5DD301188633800081F03 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; };
 		D2A5DD401188640400081F03 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; };
 		D2A5DD411188642E00081F03 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; };
+		D2F9A3D51212F87C002747C1 /* exception_handler_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A3D41212F87C002747C1 /* exception_handler_test.cc */; };
+		D2F9A43D12131F55002747C1 /* gmock-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A43C12131F55002747C1 /* gmock-all.cc */; };
+		D2F9A44012131F65002747C1 /* gtest_main.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A43E12131F65002747C1 /* gtest_main.cc */; };
+		D2F9A44112131F65002747C1 /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A43F12131F65002747C1 /* gtest-all.cc */; };
+		D2F9A44412131F84002747C1 /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2F9A41512131EF0002747C1 /* libgtest.a */; };
+		D2F9A4C9121336C7002747C1 /* client_info.h in Headers */ = {isa = PBXBuildFile; fileRef = D2F9A4C4121336C7002747C1 /* client_info.h */; };
+		D2F9A4CA121336C7002747C1 /* crash_generation_client.h in Headers */ = {isa = PBXBuildFile; fileRef = D2F9A4C5121336C7002747C1 /* crash_generation_client.h */; };
+		D2F9A4CB121336C7002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; };
+		D2F9A4CC121336C7002747C1 /* crash_generation_server.h in Headers */ = {isa = PBXBuildFile; fileRef = D2F9A4C7121336C7002747C1 /* crash_generation_server.h */; };
+		D2F9A4CD121336C7002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; };
+		D2F9A4DF12133AD9002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; };
+		D2F9A4E012133AD9002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; };
+		D2F9A4E112133AE2002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; };
+		D2F9A4E212133AE2002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; };
+		D2F9A52E121383A1002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; };
+		D2F9A52F121383A1002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; };
+		D2F9A530121383A1002747C1 /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; };
+		D2F9A531121383A1002747C1 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; };
+		D2F9A532121383A1002747C1 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; };
+		D2F9A533121383A1002747C1 /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; };
+		D2F9A534121383A1002747C1 /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; };
+		D2F9A535121383A1002747C1 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };
+		D2F9A536121383A1002747C1 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };
+		D2F9A537121383A1002747C1 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };
+		D2F9A538121383A1002747C1 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; };
+		D2F9A539121383A1002747C1 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; };
+		D2F9A53A121383A1002747C1 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; };
+		D2F9A53B121383A1002747C1 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; };
+		D2F9A53C121383A1002747C1 /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; };
+		D2F9A53F121383A1002747C1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
+		D2F9A540121383A1002747C1 /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B4BDAA7120124EA009C7060 /* libcrypto.dylib */; };
+		D2F9A541121383A1002747C1 /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2F9A41512131EF0002747C1 /* libgtest.a */; };
+		D2F9A553121383DC002747C1 /* crash_generation_server_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4CE121336F7002747C1 /* crash_generation_server_test.cc */; };
 		F91AF5D00FD60393009D8BE2 /* BreakpadFramework_Test.mm in Sources */ = {isa = PBXBuildFile; fileRef = F91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */; };
 		F91AF6210FD60784009D8BE2 /* Breakpad.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; };
 		F9286B3A0F7EB25800A4DCC8 /* InspectorMain.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9286B390F7EB25800A4DCC8 /* InspectorMain.mm */; };
 		F92C53B80ECCE7B3009BE4BA /* Inspector.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53B70ECCE7B3009BE4BA /* Inspector.mm */; };
 		F92C554C0ECCF534009BE4BA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
 		F92C55D00ECD0064009BE4BA /* Breakpad.h in Headers */ = {isa = PBXBuildFile; fileRef = F92C55CE0ECD0064009BE4BA /* Breakpad.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		F92C55D10ECD0064009BE4BA /* Breakpad.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C55CF0ECD0064009BE4BA /* Breakpad.mm */; };
 		F92C56330ECD0DF1009BE4BA /* OnDemandServer.h in Headers */ = {isa = PBXBuildFile; fileRef = F92C56310ECD0DF1009BE4BA /* OnDemandServer.h */; };
@@ -87,17 +141,16 @@
 		F93DE3380F82C66B00608B94 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };
 		F93DE3390F82C66B00608B94 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };
 		F93DE33A0F82C66B00608B94 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };
 		F93DE33B0F82C66B00608B94 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; };
 		F93DE33C0F82C66B00608B94 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; };
 		F93DE33D0F82C66B00608B94 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; };
 		F93DE33E0F82C66B00608B94 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; };
 		F93DE33F0F82C66B00608B94 /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; };
-		F93DE3410F82C68300608B94 /* exception_handler_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F93DE3400F82C68300608B94 /* exception_handler_test.cc */; };
 		F945849E0F280E3C009A47BF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F945849C0F280E3C009A47BF /* Localizable.strings */; };
 		F9B630A0100FF96B00D0F4AC /* goArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = F9B6309F100FF96B00D0F4AC /* goArrow.png */; };
 		F9C44DB20EF07288003AEBAA /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DAC0EF07288003AEBAA /* Controller.m */; };
 		F9C44DB30EF07288003AEBAA /* crashduringload in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DAD0EF07288003AEBAA /* crashduringload */; };
 		F9C44DB40EF07288003AEBAA /* crashInMain in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DAE0EF07288003AEBAA /* crashInMain */; };
 		F9C44DB60EF07288003AEBAA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DB00EF07288003AEBAA /* main.m */; };
 		F9C44DB70EF07288003AEBAA /* TestClass.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DB10EF07288003AEBAA /* TestClass.mm */; };
 		F9C44DBC0EF072A0003AEBAA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DB80EF072A0003AEBAA /* InfoPlist.strings */; };
@@ -109,16 +162,177 @@
 		F9C44EE50EF0A006003AEBAA /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */; };
 		F9C44EE90EF0A3C1003AEBAA /* GTMLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */; };
 		F9C77DE20F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9C77DE10F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm */; };
 		F9C77DE40F7DD82F0045F7DB /* SimpleStringDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53810ECCE635009BE4BA /* SimpleStringDictionary.mm */; };
 		F9C77E130F7DDF810045F7DB /* GTMSenTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
+		8B31023811F0CF0600FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = B88FAFC9116BDCAD00407530;
+			remoteInfo = all_unittests;
+		};
+		8B31051611F1010E00FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = F93803BD0F80820F004D428B;
+			remoteInfo = generator_test;
+		};
+		8B31051811F1010E00FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = F93DE2D00F82A67300608B94;
+			remoteInfo = minidump_file_writer_unittest;
+		};
+		8B31051A11F1010E00FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = F93DE32B0F82C55600608B94;
+			remoteInfo = handler_test;
+		};
+		8B31051C11F1010E00FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = B89E0E731166575200DD08C9;
+			remoteInfo = macho_dump;
+		};
+		8B31051E11F1010E00FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = 9BD835FA0B0544950055103E;
+			remoteInfo = minidump_upload;
+		};
+		8B31F7A011EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B89E0E741166575200DD08C9;
+			remoteInfo = macho_dump;
+		};
+		8B31F7A211EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B88FB024116BDFFF00407530;
+			remoteInfo = gtestmockall;
+		};
+		8B31F7A411EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B88FB14B116CF4A700407530;
+			remoteInfo = byte_cursor_unittest;
+		};
+		8B31F7A611EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B89E0E9511665A6400DD08C9;
+			remoteInfo = macho_reader_unittest;
+		};
+		8B31F7A811EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B88FB007116BDE8300407530;
+			remoteInfo = stabs_reader_unittest;
+		};
+		8B31F7AA11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B88FB135116CF30F00407530;
+			remoteInfo = bytereader_unittest;
+		};
+		8B31F7AC11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B88FAF2F116A591E00407530;
+			remoteInfo = dwarf2reader_cfi_unittest;
+		};
+		8B31F7AE11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B88FB0DF116CEEA800407530;
+			remoteInfo = dwarf2diehandler_unittest;
+		};
+		8B31F7B011EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B88FB10A116CF07900407530;
+			remoteInfo = dwarf_cu_to_module_unittest;
+		};
+		8B31F7B211EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B88FB0F2116CEF1900407530;
+			remoteInfo = dwarf_line_to_module_unittest;
+		};
+		8B31F7B411EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B88FB11F116CF27F00407530;
+			remoteInfo = dwarf_cfi_to_module_unittest;
+		};
+		8B31F7B611EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B84A91F4116CF784006C210E;
+			remoteInfo = stabs_to_module_unittest;
+		};
+		8B31F7B811EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = B88FB0B9116CEABF00407530;
+			remoteInfo = module_unittest;
+		};
+		8B31F7BA11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = D21F97D211CBA0F200239E38;
+			remoteInfo = test_assembler_unittest;
+		};
+		D2F9A44212131F80002747C1 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = D2F9A41412131EF0002747C1;
+			remoteInfo = gtest;
+		};
+		D2F9A52C121383A1002747C1 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = D2F9A41412131EF0002747C1;
+			remoteInfo = gtest;
+		};
+		D2F9A5DE12142A6A002747C1 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = D2F9A52A121383A1002747C1;
+			remoteInfo = crash_generation_server_test;
+		};
 		F91AF6370FD60A74009D8BE2 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
 			proxyType = 1;
 			remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
 			remoteInfo = Breakpad;
 		};
 		F92C564D0ECD10E5009BE4BA /* PBXContainerItemProxy */ = {
@@ -225,17 +439,17 @@
 			proxyType = 2;
 			remoteGlobalIDString = 9BD835FB0B0544950055103E;
 			remoteInfo = minidump_upload;
 		};
 		F95BB8B2101F94D300AA053B /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
 			proxyType = 1;
-			remoteGlobalIDString = 8DD76F960486AA7600D96B5E;
+			remoteGlobalIDString = B8C5B5101166531A00D34F4E;
 			remoteInfo = dump_syms;
 		};
 		F95BB8B4101F94D300AA053B /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */;
 			proxyType = 1;
 			remoteGlobalIDString = 8DD76F960486AA7600D96B5E;
 			remoteInfo = symupload;
@@ -273,24 +487,65 @@
 				F9C44E3C0EF08B12003AEBAA /* Breakpad.framework in Copy Frameworks */,
 			);
 			name = "Copy Frameworks";
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
-		0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
-		1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+		0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+		1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
 		32DBCF5E0370ADEE00C91783 /* Breakpad_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Breakpad_Prefix.pch; path = Framework/Breakpad_Prefix.pch; sourceTree = "<group>"; };
 		3329D4EC0FA16D820007BBC5 /* Breakpad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Breakpad.xib; path = sender/Breakpad.xib; sourceTree = "<group>"; };
 		33880C7F0F9E097100817F82 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = sender/English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = crash_report_sender.icns; path = sender/crash_report_sender.icns; sourceTree = "<group>"; };
+		8B31007011F0CD3C00FCF3E4 /* GTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMDefines.h; path = ../../common/mac/GTMDefines.h; sourceTree = SOURCE_ROOT; };
+		8B3101E911F0CDE300FCF3E4 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
+		8B31022211F0CE1000FCF3E4 /* GTMGarbageCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMGarbageCollection.h; path = ../../common/mac/GTMGarbageCollection.h; sourceTree = SOURCE_ROOT; };
+		8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadDebug.xcconfig; path = ../../common/mac/BreakpadDebug.xcconfig; sourceTree = SOURCE_ROOT; };
+		8B31027811F0D3AF00FCF3E4 /* BreakpadRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadRelease.xcconfig; path = ../../common/mac/BreakpadRelease.xcconfig; sourceTree = SOURCE_ROOT; };
+		8B31FFF611F0C90500FCF3E4 /* Breakpad.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Breakpad.xcconfig; path = ../../common/mac/Breakpad.xcconfig; sourceTree = SOURCE_ROOT; };
+		8B4BDAA7120124EA009C7060 /* libcrypto.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcrypto.dylib; path = usr/lib/libcrypto.dylib; sourceTree = SDKROOT; };
 		8DC2EF5B0486A6940098B216 /* Breakpad.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Breakpad.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		D2F9A3D41212F87C002747C1 /* exception_handler_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exception_handler_test.cc; path = tests/exception_handler_test.cc; sourceTree = "<group>"; };
+		D2F9A41512131EF0002747C1 /* libgtest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		D2F9A43C12131F55002747C1 /* gmock-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gmock-all.cc"; path = "../../testing/src/gmock-all.cc"; sourceTree = SOURCE_ROOT; };
+		D2F9A43E12131F65002747C1 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gtest_main.cc; path = ../../testing/gtest/src/gtest_main.cc; sourceTree = "<group>"; };
+		D2F9A43F12131F65002747C1 /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gtest-all.cc"; path = "../../testing/gtest/src/gtest-all.cc"; sourceTree = "<group>"; };
+		D2F9A4C4121336C7002747C1 /* client_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = client_info.h; path = crash_generation/client_info.h; sourceTree = "<group>"; };
+		D2F9A4C5121336C7002747C1 /* crash_generation_client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_generation_client.h; path = crash_generation/crash_generation_client.h; sourceTree = "<group>"; };
+		D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crash_generation_client.cc; path = crash_generation/crash_generation_client.cc; sourceTree = "<group>"; };
+		D2F9A4C7121336C7002747C1 /* crash_generation_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_generation_server.h; path = crash_generation/crash_generation_server.h; sourceTree = "<group>"; };
+		D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crash_generation_server.cc; path = crash_generation/crash_generation_server.cc; sourceTree = "<group>"; };
+		D2F9A4CE121336F7002747C1 /* crash_generation_server_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crash_generation_server_test.cc; path = tests/crash_generation_server_test.cc; sourceTree = "<group>"; };
+		D2F9A546121383A1002747C1 /* crash_generation_server_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = crash_generation_server_test; sourceTree = BUILT_PRODUCTS_DIR; };
+		DE43467411C72855004F095F /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = sender/da.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43467511C72857004F095F /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = sender/de.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43467611C7285B004F095F /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = sender/es.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43467711C72862004F095F /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = sender/fr.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43467811C72869004F095F /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = sender/it.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43467911C7286D004F095F /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = sender/nl.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43467A11C72873004F095F /* no */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = no; path = sender/no.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43467B11C72877004F095F /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sender/sl.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43467C11C7287A004F095F /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sender/sv.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43467E11C728DC004F095F /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = sender/ja.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43467F11C728E1004F095F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = sender/tr.lproj/Localizable.strings; sourceTree = "<group>"; };
+		DE43468611C72958004F095F /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = sender/de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DE43468711C7295D004F095F /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = sender/da.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DE43468811C7295F004F095F /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = sender/es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DE43468911C72964004F095F /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = sender/fr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DE43468A11C72967004F095F /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = sender/it.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DE43468B11C7296B004F095F /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = sender/ja.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DE43468C11C7296D004F095F /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = sender/nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DE43468D11C7296F004F095F /* no */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = no; path = sender/no.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DE43468E11C72971004F095F /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sender/sl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DE43468F11C72973004F095F /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sender/sv.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		DE43469011C72976004F095F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = sender/tr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		F91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = BreakpadFramework_Test.mm; path = tests/BreakpadFramework_Test.mm; sourceTree = "<group>"; };
 		F9286B380F7EB25800A4DCC8 /* Inspector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Inspector.h; path = crash_generation/Inspector.h; sourceTree = "<group>"; };
 		F9286B390F7EB25800A4DCC8 /* InspectorMain.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = InspectorMain.mm; path = crash_generation/InspectorMain.mm; sourceTree = "<group>"; };
 		F92C53540ECCE349009BE4BA /* Inspector */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Inspector; sourceTree = BUILT_PRODUCTS_DIR; };
 		F92C53670ECCE3FD009BE4BA /* breakpad_exc_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = breakpad_exc_server.c; path = handler/breakpad_exc_server.c; sourceTree = SOURCE_ROOT; };
 		F92C53680ECCE3FD009BE4BA /* breakpad_exc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = breakpad_exc_server.h; path = handler/breakpad_exc_server.h; sourceTree = SOURCE_ROOT; };
 		F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = breakpad_nlist_64.cc; path = handler/breakpad_nlist_64.cc; sourceTree = SOURCE_ROOT; };
 		F92C536A0ECCE3FD009BE4BA /* breakpad_nlist_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = breakpad_nlist_64.h; path = handler/breakpad_nlist_64.h; sourceTree = SOURCE_ROOT; };
@@ -321,32 +576,31 @@
 		F92C53850ECCE6AD009BE4BA /* string_conversion.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = string_conversion.cc; path = ../../common/string_conversion.cc; sourceTree = SOURCE_ROOT; };
 		F92C53860ECCE6AD009BE4BA /* string_conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = string_conversion.h; path = ../../common/string_conversion.h; sourceTree = SOURCE_ROOT; };
 		F92C53870ECCE6C0009BE4BA /* convert_UTF.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = convert_UTF.c; path = ../../common/convert_UTF.c; sourceTree = SOURCE_ROOT; };
 		F92C53880ECCE6C0009BE4BA /* convert_UTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = convert_UTF.h; path = ../../common/convert_UTF.h; sourceTree = SOURCE_ROOT; };
 		F92C538E0ECCE70A009BE4BA /* minidump_file_writer-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "minidump_file_writer-inl.h"; path = "../minidump_file_writer-inl.h"; sourceTree = SOURCE_ROOT; };
 		F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer.cc; path = ../minidump_file_writer.cc; sourceTree = SOURCE_ROOT; };
 		F92C53900ECCE70A009BE4BA /* minidump_file_writer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = minidump_file_writer.h; path = ../minidump_file_writer.h; sourceTree = SOURCE_ROOT; };
 		F92C53B70ECCE7B3009BE4BA /* Inspector.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Inspector.mm; path = crash_generation/Inspector.mm; sourceTree = SOURCE_ROOT; };
-		F92C554A0ECCF530009BE4BA /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
+		F92C554A0ECCF530009BE4BA /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
 		F92C55CE0ECD0064009BE4BA /* Breakpad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Breakpad.h; path = Framework/Breakpad.h; sourceTree = "<group>"; };
 		F92C55CF0ECD0064009BE4BA /* Breakpad.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Breakpad.mm; path = Framework/Breakpad.mm; sourceTree = "<group>"; };
 		F92C56310ECD0DF1009BE4BA /* OnDemandServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OnDemandServer.h; path = Framework/OnDemandServer.h; sourceTree = "<group>"; };
 		F92C56320ECD0DF1009BE4BA /* OnDemandServer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = OnDemandServer.mm; path = Framework/OnDemandServer.mm; sourceTree = "<group>"; };
 		F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = breakpadUtilities.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
 		F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = crash_report_sender.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		F92C56A20ECE04A7009BE4BA /* crash_report_sender-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "crash_report_sender-Info.plist"; path = "sender/crash_report_sender-Info.plist"; sourceTree = "<group>"; };
 		F92C56A70ECE04C5009BE4BA /* crash_report_sender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_report_sender.h; path = sender/crash_report_sender.h; sourceTree = "<group>"; };
 		F92C56A80ECE04C5009BE4BA /* crash_report_sender.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = crash_report_sender.m; path = sender/crash_report_sender.m; sourceTree = "<group>"; };
 		F93803BE0F80820F004D428B /* generator_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = generator_test; sourceTree = BUILT_PRODUCTS_DIR; };
 		F93803D90F8083D8004D428B /* minidump_generator_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_generator_test.cc; path = handler/minidump_generator_test.cc; sourceTree = "<group>"; };
 		F93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = minidump_file_writer_unittest; sourceTree = BUILT_PRODUCTS_DIR; };
 		F93DE2D70F82A70E00608B94 /* minidump_file_writer_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer_unittest.cc; path = ../minidump_file_writer_unittest.cc; sourceTree = SOURCE_ROOT; };
 		F93DE32C0F82C55600608B94 /* handler_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = handler_test; sourceTree = BUILT_PRODUCTS_DIR; };
-		F93DE3400F82C68300608B94 /* exception_handler_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exception_handler_test.cc; path = handler/exception_handler_test.cc; sourceTree = "<group>"; };
 		F945849D0F280E3C009A47BF /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = sender/English.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F945859D0F78241E009A47BF /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Framework/Info.plist; sourceTree = "<group>"; };
 		F95BB87C101F949F00AA053B /* crash_report.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = crash_report.xcodeproj; path = ../../tools/mac/crash_report/crash_report.xcodeproj; sourceTree = SOURCE_ROOT; };
 		F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = dump_syms.xcodeproj; path = ../../tools/mac/dump_syms/dump_syms.xcodeproj; sourceTree = SOURCE_ROOT; };
 		F95BB894101F94C000AA053B /* symupload.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = symupload.xcodeproj; path = ../../tools/mac/symupload/symupload.xcodeproj; sourceTree = SOURCE_ROOT; };
 		F9B6309F100FF96B00D0F4AC /* goArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = goArrow.png; path = sender/goArrow.png; sourceTree = "<group>"; };
 		F9C44DA50EF060A8003AEBAA /* BreakpadTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BreakpadTest.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		F9C44DAC0EF07288003AEBAA /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Controller.m; path = testapp/Controller.m; sourceTree = "<group>"; };
@@ -354,17 +608,17 @@
 		F9C44DAE0EF07288003AEBAA /* crashInMain */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = crashInMain; path = testapp/crashInMain; sourceTree = "<group>"; };
 		F9C44DAF0EF07288003AEBAA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = testapp/Info.plist; sourceTree = "<group>"; };
 		F9C44DB00EF07288003AEBAA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = testapp/main.m; sourceTree = "<group>"; };
 		F9C44DB10EF07288003AEBAA /* TestClass.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = TestClass.mm; path = testapp/TestClass.mm; sourceTree = "<group>"; };
 		F9C44DB90EF072A0003AEBAA /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = testapp/English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		F9C44DBB0EF072A0003AEBAA /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = testapp/English.lproj/MainMenu.xib; sourceTree = "<group>"; };
 		F9C44DBF0EF0778F003AEBAA /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Controller.h; path = testapp/Controller.h; sourceTree = "<group>"; };
 		F9C44DC00EF0778F003AEBAA /* TestClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestClass.h; path = testapp/TestClass.h; sourceTree = "<group>"; };
-		F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = "<absolute>"; };
+		F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
 		F9C44EE70EF0A3C1003AEBAA /* GTMLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMLogger.h; path = ../../common/mac/GTMLogger.h; sourceTree = SOURCE_ROOT; };
 		F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMLogger.m; path = ../../common/mac/GTMLogger.m; sourceTree = SOURCE_ROOT; };
 		F9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
 		F9C77DDB0F7DD5CF0045F7DB /* UnitTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "UnitTests-Info.plist"; sourceTree = "<group>"; };
 		F9C77DE00F7DD7E30045F7DB /* SimpleStringDictionaryTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleStringDictionaryTest.h; path = tests/SimpleStringDictionaryTest.h; sourceTree = "<group>"; };
 		F9C77DE10F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SimpleStringDictionaryTest.mm; path = tests/SimpleStringDictionaryTest.mm; sourceTree = "<group>"; };
 		F9C77E110F7DDF810045F7DB /* GTMSenTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMSenTestCase.h; path = ../../common/mac/testing/GTMSenTestCase.h; sourceTree = SOURCE_ROOT; };
 		F9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMSenTestCase.m; path = ../../common/mac/testing/GTMSenTestCase.m; sourceTree = SOURCE_ROOT; };
@@ -375,75 +629,106 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F92C565C0ECD1158009BE4BA /* breakpadUtilities.dylib in Frameworks */,
 				8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		D2F9A41312131EF0002747C1 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		D2F9A53E121383A1002747C1 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				D2F9A53F121383A1002747C1 /* Foundation.framework in Frameworks */,
+				D2F9A540121383A1002747C1 /* libcrypto.dylib in Frameworks */,
+				D2F9A541121383A1002747C1 /* libgtest.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		F92C53520ECCE349009BE4BA /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F92C564C0ECD10DD009BE4BA /* breakpadUtilities.dylib in Frameworks */,
 				F92C554C0ECCF534009BE4BA /* Foundation.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F92C563A0ECD10B3009BE4BA /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8B31FC8211EFD2B800FCF3E4 /* Foundation.framework in Frameworks */,
 				F92C56570ECD113E009BE4BA /* Carbon.framework in Frameworks */,
+				8B4BDAAF12012BC5009C7060 /* libcrypto.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F92C569E0ECE04A7009BE4BA /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F9C44EE50EF0A006003AEBAA /* SystemConfiguration.framework in Frameworks */,
+				8B3101C611F0CD9F00FCF3E4 /* AppKit.framework in Frameworks */,
+				8B3101C711F0CD9F00FCF3E4 /* Foundation.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F93803BC0F80820F004D428B /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8B31029411F0D54300FCF3E4 /* Foundation.framework in Frameworks */,
+				8B4BDABE12012CEF009C7060 /* libcrypto.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F93DE2CF0F82A67300608B94 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F93DE32A0F82C55600608B94 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8B3102E611F0D74C00FCF3E4 /* Foundation.framework in Frameworks */,
+				8B4BDAC512012D05009C7060 /* libcrypto.dylib in Frameworks */,
+				D2F9A44412131F84002747C1 /* libgtest.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F9C44DA30EF060A8003AEBAA /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F9C44E000EF077CD003AEBAA /* Breakpad.framework in Frameworks */,
+				8B3101CA11F0CDB000FCF3E4 /* AppKit.framework in Frameworks */,
+				8B3101CB11F0CDB000FCF3E4 /* Foundation.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F9C77DD70F7DD5CF0045F7DB /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F91AF6210FD60784009D8BE2 /* Breakpad.framework in Frameworks */,
+				8B3101EA11F0CDE300FCF3E4 /* SenTestingKit.framework in Frameworks */,
+				8B3102EB11F0D78000FCF3E4 /* Foundation.framework in Frameworks */,
+				D24BBBFD121050F000F3D417 /* breakpadUtilities.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
 		034768DFFF38A50411DB9C8B /* Products */ = {
 			isa = PBXGroup;
@@ -452,50 +737,67 @@
 				F92C53540ECCE349009BE4BA /* Inspector */,
 				F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */,
 				F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */,
 				F9C44DA50EF060A8003AEBAA /* BreakpadTest.app */,
 				F9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */,
 				F93803BE0F80820F004D428B /* generator_test */,
 				F93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */,
 				F93DE32C0F82C55600608B94 /* handler_test */,
+				D2F9A41512131EF0002747C1 /* libgtest.a */,
+				D2F9A546121383A1002747C1 /* crash_generation_server_test */,
 			);
 			name = Products;
 			sourceTree = "<group>";
 		};
 		0867D691FE84028FC02AAC07 /* Breakpad */ = {
 			isa = PBXGroup;
 			children = (
+				D2F9A43812131F3B002747C1 /* gtest */,
+				8B31FFF611F0C90500FCF3E4 /* Breakpad.xcconfig */,
+				8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */,
+				8B31027811F0D3AF00FCF3E4 /* BreakpadRelease.xcconfig */,
 				F95BB8A3101F94C300AA053B /* Tools */,
 				32DBCF5E0370ADEE00C91783 /* Breakpad_Prefix.pch */,
 				F92C538D0ECCE6F2009BE4BA /* client */,
 				F92C53600ECCE3D6009BE4BA /* common */,
 				0867D69AFE84028FC02AAC07 /* Frameworks */,
 				034768DFFF38A50411DB9C8B /* Products */,
 				F9C77DDB0F7DD5CF0045F7DB /* UnitTests-Info.plist */,
 			);
 			name = Breakpad;
 			sourceTree = "<group>";
 		};
 		0867D69AFE84028FC02AAC07 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				8B4BDAA7120124EA009C7060 /* libcrypto.dylib */,
+				8B3101E911F0CDE300FCF3E4 /* SenTestingKit.framework */,
 				F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */,
 				F92C554A0ECCF530009BE4BA /* Carbon.framework */,
 				1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */,
 				0867D6A5FE840307C02AAC07 /* AppKit.framework */,
 				0867D69BFE84028FC02AAC07 /* Foundation.framework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
 		};
+		D2F9A43812131F3B002747C1 /* gtest */ = {
+			isa = PBXGroup;
+			children = (
+				D2F9A43E12131F65002747C1 /* gtest_main.cc */,
+				D2F9A43F12131F65002747C1 /* gtest-all.cc */,
+				D2F9A43C12131F55002747C1 /* gmock-all.cc */,
+			);
+			name = gtest;
+			sourceTree = "<group>";
+		};
 		F92C53590ECCE3BB009BE4BA /* handler */ = {
 			isa = PBXGroup;
 			children = (
-				F93DE3400F82C68300608B94 /* exception_handler_test.cc */,
 				F93803D90F8083D8004D428B /* minidump_generator_test.cc */,
 				F92C53670ECCE3FD009BE4BA /* breakpad_exc_server.c */,
 				F92C53680ECCE3FD009BE4BA /* breakpad_exc_server.h */,
 				F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */,
 				F92C536A0ECCE3FD009BE4BA /* breakpad_nlist_64.h */,
 				F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */,
 				F92C536C0ECCE3FD009BE4BA /* dynamic_images.h */,
 				F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */,
@@ -518,16 +820,18 @@
 				F92C53840ECCE68D009BE4BA /* mac */,
 			);
 			name = common;
 			sourceTree = "<group>";
 		};
 		F92C53840ECCE68D009BE4BA /* mac */ = {
 			isa = PBXGroup;
 			children = (
+				8B31022211F0CE1000FCF3E4 /* GTMGarbageCollection.h */,
+				8B31007011F0CD3C00FCF3E4 /* GTMDefines.h */,
 				F9C77E0F0F7DDF650045F7DB /* testing */,
 				F9C44EE70EF0A3C1003AEBAA /* GTMLogger.h */,
 				F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */,
 				F92C53740ECCE635009BE4BA /* file_id.cc */,
 				F92C53750ECCE635009BE4BA /* file_id.h */,
 				F92C53760ECCE635009BE4BA /* HTTPMultipartUpload.h */,
 				F92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */,
 				F92C53780ECCE635009BE4BA /* MachIPC.h */,
@@ -569,16 +873,21 @@
 				F92C53590ECCE3BB009BE4BA /* handler */,
 			);
 			name = mac;
 			sourceTree = "<group>";
 		};
 		F92C53B50ECCE799009BE4BA /* crash_generation */ = {
 			isa = PBXGroup;
 			children = (
+				D2F9A4C4121336C7002747C1 /* client_info.h */,
+				D2F9A4C5121336C7002747C1 /* crash_generation_client.h */,
+				D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */,
+				D2F9A4C7121336C7002747C1 /* crash_generation_server.h */,
+				D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */,
 				F9286B380F7EB25800A4DCC8 /* Inspector.h */,
 				F9286B390F7EB25800A4DCC8 /* InspectorMain.mm */,
 				F92C53B70ECCE7B3009BE4BA /* Inspector.mm */,
 			);
 			name = crash_generation;
 			sourceTree = "<group>";
 		};
 		F92C55CD0ECD0053009BE4BA /* Framework */ = {
@@ -615,16 +924,30 @@
 			);
 			name = Products;
 			sourceTree = "<group>";
 		};
 		F95BB88A101F94AC00AA053B /* Products */ = {
 			isa = PBXGroup;
 			children = (
 				F95BB892101F94AC00AA053B /* dump_syms */,
+				8B31F7A111EF9A8700FCF3E4 /* macho_dump */,
+				8B31F7A311EF9A8700FCF3E4 /* libgtestmockall.a */,
+				8B31F7A511EF9A8700FCF3E4 /* byte_cursor_unittest */,
+				8B31F7A711EF9A8700FCF3E4 /* macho_reader_unittest */,
+				8B31F7A911EF9A8700FCF3E4 /* stabs_reader_unittest */,
+				8B31F7AB11EF9A8700FCF3E4 /* bytereader_unittest */,
+				8B31F7AD11EF9A8700FCF3E4 /* dwarf2reader_cfi_unittest */,
+				8B31F7AF11EF9A8700FCF3E4 /* dwarf2diehandler_unittest */,
+				8B31F7B111EF9A8700FCF3E4 /* dwarf_cu_to_module_unittest */,
+				8B31F7B311EF9A8700FCF3E4 /* dwarf_line_to_module_unittest */,
+				8B31F7B511EF9A8700FCF3E4 /* dwarf_cfi_to_module_unittest */,
+				8B31F7B711EF9A8700FCF3E4 /* stabs_to_module_unittest */,
+				8B31F7B911EF9A8700FCF3E4 /* module_unittest */,
+				8B31F7BB11EF9A8700FCF3E4 /* test_assembler_unittest */,
 			);
 			name = Products;
 			sourceTree = "<group>";
 		};
 		F95BB895101F94C000AA053B /* Products */ = {
 			isa = PBXGroup;
 			children = (
 				F95BB89F101F94C000AA053B /* symupload */,
@@ -658,16 +981,18 @@
 				F9C44DB10EF07288003AEBAA /* TestClass.mm */,
 			);
 			name = testapp;
 			sourceTree = "<group>";
 		};
 		F9C77DDF0F7DD7CF0045F7DB /* tests */ = {
 			isa = PBXGroup;
 			children = (
+				D2F9A4CE121336F7002747C1 /* crash_generation_server_test.cc */,
+				D2F9A3D41212F87C002747C1 /* exception_handler_test.cc */,
 				F9C77DE00F7DD7E30045F7DB /* SimpleStringDictionaryTest.h */,
 				F9C77DE10F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm */,
 				F91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */,
 			);
 			name = tests;
 			sourceTree = "<group>";
 		};
 		F9C77E0F0F7DDF650045F7DB /* testing */ = {
@@ -683,16 +1008,26 @@
 
 /* Begin PBXHeadersBuildPhase section */
 		8DC2EF500486A6940098B216 /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F92C55D00ECD0064009BE4BA /* Breakpad.h in Headers */,
 				F92C56330ECD0DF1009BE4BA /* OnDemandServer.h in Headers */,
+				D2F9A4C9121336C7002747C1 /* client_info.h in Headers */,
+				D2F9A4CA121336C7002747C1 /* crash_generation_client.h in Headers */,
+				D2F9A4CC121336C7002747C1 /* crash_generation_server.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		D2F9A41112131EF0002747C1 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F92C56380ECD10B3009BE4BA /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
@@ -719,16 +1054,50 @@
 				F9C44E970EF09F4B003AEBAA /* PBXTargetDependency */,
 			);
 			name = Breakpad;
 			productInstallPath = "$(HOME)/Library/Frameworks";
 			productName = Breakpad;
 			productReference = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */;
 			productType = "com.apple.product-type.framework";
 		};
+		D2F9A41412131EF0002747C1 /* gtest */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = D2F9A42D12131F0E002747C1 /* Build configuration list for PBXNativeTarget "gtest" */;
+			buildPhases = (
+				D2F9A41112131EF0002747C1 /* Headers */,
+				D2F9A41212131EF0002747C1 /* Sources */,
+				D2F9A41312131EF0002747C1 /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = gtest;
+			productName = gtest;
+			productReference = D2F9A41512131EF0002747C1 /* libgtest.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		D2F9A52A121383A1002747C1 /* crash_generation_server_test */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = D2F9A542121383A1002747C1 /* Build configuration list for PBXNativeTarget "crash_generation_server_test" */;
+			buildPhases = (
+				D2F9A52D121383A1002747C1 /* Sources */,
+				D2F9A53E121383A1002747C1 /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				D2F9A52B121383A1002747C1 /* PBXTargetDependency */,
+			);
+			name = crash_generation_server_test;
+			productName = handler_test;
+			productReference = D2F9A546121383A1002747C1 /* crash_generation_server_test */;
+			productType = "com.apple.product-type.tool";
+		};
 		F92C53530ECCE349009BE4BA /* Inspector */ = {
 			isa = PBXNativeTarget;
 			buildConfigurationList = F92C53580ECCE36D009BE4BA /* Build configuration list for PBXNativeTarget "Inspector" */;
 			buildPhases = (
 				F94584840F27FB40009A47BF /* Change install name of breakpadUtilities */,
 				F92C53510ECCE349009BE4BA /* Sources */,
 				F92C53520ECCE349009BE4BA /* Frameworks */,
 			);
@@ -813,16 +1182,17 @@
 			buildConfigurationList = F93DE3320F82C5D800608B94 /* Build configuration list for PBXNativeTarget "handler_test" */;
 			buildPhases = (
 				F93DE3290F82C55600608B94 /* Sources */,
 				F93DE32A0F82C55600608B94 /* Frameworks */,
 			);
 			buildRules = (
 			);
 			dependencies = (
+				D2F9A44312131F80002747C1 /* PBXTargetDependency */,
 			);
 			name = handler_test;
 			productName = handler_test;
 			productReference = F93DE32C0F82C55600608B94 /* handler_test */;
 			productType = "com.apple.product-type.tool";
 		};
 		F9C44DA40EF060A8003AEBAA /* BreakpadTest */ = {
 			isa = PBXNativeTarget;
@@ -853,30 +1223,45 @@
 				F9C77DD80F7DD5CF0045F7DB /* ShellScript */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 				F93DE2FC0F82C3C600608B94 /* PBXTargetDependency */,
 				F93DE3700F82CC1300608B94 /* PBXTargetDependency */,
 				F91AF6380FD60A74009D8BE2 /* PBXTargetDependency */,
+				D2F9A5DF12142A6A002747C1 /* PBXTargetDependency */,
 			);
 			name = UnitTests;
 			productName = UnitTests;
 			productReference = F9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */;
 			productType = "com.apple.product-type.bundle";
 		};
 /* End PBXNativeTarget section */
 
 /* Begin PBXProject section */
 		0867D690FE84028FC02AAC07 /* Project object */ = {
 			isa = PBXProject;
 			buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Breakpad" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.1";
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				English,
+				da,
+				de,
+				es,
+				fr,
+				it,
+				ja,
+				nl,
+				no,
+				sl,
+				sv,
+				tr,
+			);
 			mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */;
 			productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
 			projectDirPath = "";
 			projectReferences = (
 				{
 					ProductGroup = F95BB87D101F949F00AA053B /* Products */;
 					ProjectRef = F95BB87C101F949F00AA053B /* crash_report.xcodeproj */;
 				},
@@ -896,21 +1281,121 @@
 				F92C563B0ECD10B3009BE4BA /* breakpadUtilities */,
 				F92C569F0ECE04A7009BE4BA /* crash_report_sender */,
 				F9C44DA40EF060A8003AEBAA /* BreakpadTest */,
 				F94585840F782326009A47BF /* All */,
 				F9C77DD90F7DD5CF0045F7DB /* UnitTests */,
 				F93803BD0F80820F004D428B /* generator_test */,
 				F93DE2D00F82A67300608B94 /* minidump_file_writer_unittest */,
 				F93DE32B0F82C55600608B94 /* handler_test */,
+				D2F9A41412131EF0002747C1 /* gtest */,
+				D2F9A52A121383A1002747C1 /* crash_generation_server_test */,
 			);
 		};
 /* End PBXProject section */
 
 /* Begin PBXReferenceProxy section */
+		8B31F7A111EF9A8700FCF3E4 /* macho_dump */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = macho_dump;
+			remoteRef = 8B31F7A011EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7A311EF9A8700FCF3E4 /* libgtestmockall.a */ = {
+			isa = PBXReferenceProxy;
+			fileType = archive.ar;
+			path = libgtestmockall.a;
+			remoteRef = 8B31F7A211EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7A511EF9A8700FCF3E4 /* byte_cursor_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = byte_cursor_unittest;
+			remoteRef = 8B31F7A411EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7A711EF9A8700FCF3E4 /* macho_reader_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = macho_reader_unittest;
+			remoteRef = 8B31F7A611EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7A911EF9A8700FCF3E4 /* stabs_reader_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = stabs_reader_unittest;
+			remoteRef = 8B31F7A811EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7AB11EF9A8700FCF3E4 /* bytereader_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = bytereader_unittest;
+			remoteRef = 8B31F7AA11EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7AD11EF9A8700FCF3E4 /* dwarf2reader_cfi_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = dwarf2reader_cfi_unittest;
+			remoteRef = 8B31F7AC11EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7AF11EF9A8700FCF3E4 /* dwarf2diehandler_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = dwarf2diehandler_unittest;
+			remoteRef = 8B31F7AE11EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7B111EF9A8700FCF3E4 /* dwarf_cu_to_module_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = dwarf_cu_to_module_unittest;
+			remoteRef = 8B31F7B011EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7B311EF9A8700FCF3E4 /* dwarf_line_to_module_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = dwarf_line_to_module_unittest;
+			remoteRef = 8B31F7B211EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7B511EF9A8700FCF3E4 /* dwarf_cfi_to_module_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = dwarf_cfi_to_module_unittest;
+			remoteRef = 8B31F7B411EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7B711EF9A8700FCF3E4 /* stabs_to_module_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = stabs_to_module_unittest;
+			remoteRef = 8B31F7B611EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7B911EF9A8700FCF3E4 /* module_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = module_unittest;
+			remoteRef = 8B31F7B811EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		8B31F7BB11EF9A8700FCF3E4 /* test_assembler_unittest */ = {
+			isa = PBXReferenceProxy;
+			fileType = "compiled.mach-o.executable";
+			path = test_assembler_unittest;
+			remoteRef = 8B31F7BA11EF9A8700FCF3E4 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
 		F95BB885101F949F00AA053B /* crash_report */ = {
 			isa = PBXReferenceProxy;
 			fileType = "compiled.mach-o.executable";
 			path = crash_report;
 			remoteRef = F95BB884101F949F00AA053B /* PBXContainerItemProxy */;
 			sourceTree = BUILT_PRODUCTS_DIR;
 		};
 		F95BB892101F94AC00AA053B /* dump_syms */ = {
@@ -1014,29 +1499,64 @@
 			files = (
 			);
 			inputPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n\necho running minidump generator tests...\n\"${BUILT_PRODUCTS_DIR}/generator_test\"\necho Running exception handler tests...\n\"${BUILT_PRODUCTS_DIR}/handler_test\"\n";
+			shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n\necho running minidump generator tests...\n\"${BUILT_PRODUCTS_DIR}/generator_test\"\necho Running exception handler tests...\n\"${BUILT_PRODUCTS_DIR}/handler_test\"\necho Running crash generation server tests...\n\"${BUILT_PRODUCTS_DIR}/crash_generation_server_test\"\n";
 		};
 /* End PBXShellScriptBuildPhase section */
 
 /* Begin PBXSourcesBuildPhase section */
 		8DC2EF540486A6940098B216 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F92C565F0ECD116B009BE4BA /* protected_memory_allocator.cc in Sources */,
 				F92C56630ECD1179009BE4BA /* exception_handler.cc in Sources */,
 				F92C55D10ECD0064009BE4BA /* Breakpad.mm in Sources */,
 				F92C56340ECD0DF1009BE4BA /* OnDemandServer.mm in Sources */,
+				D2F9A4CB121336C7002747C1 /* crash_generation_client.cc in Sources */,
+				D2F9A4CD121336C7002747C1 /* crash_generation_server.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		D2F9A41212131EF0002747C1 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				D2F9A43D12131F55002747C1 /* gmock-all.cc in Sources */,
+				D2F9A44012131F65002747C1 /* gtest_main.cc in Sources */,
+				D2F9A44112131F65002747C1 /* gtest-all.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		D2F9A52D121383A1002747C1 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				D2F9A553121383DC002747C1 /* crash_generation_server_test.cc in Sources */,
+				D2F9A52E121383A1002747C1 /* crash_generation_client.cc in Sources */,
+				D2F9A52F121383A1002747C1 /* crash_generation_server.cc in Sources */,
+				D2F9A530121383A1002747C1 /* MachIPC.mm in Sources */,
+				D2F9A531121383A1002747C1 /* breakpad_nlist_64.cc in Sources */,
+				D2F9A532121383A1002747C1 /* dynamic_images.cc in Sources */,
+				D2F9A533121383A1002747C1 /* exception_handler.cc in Sources */,
+				D2F9A534121383A1002747C1 /* minidump_generator.cc in Sources */,
+				D2F9A535121383A1002747C1 /* minidump_file_writer.cc in Sources */,
+				D2F9A536121383A1002747C1 /* convert_UTF.c in Sources */,
+				D2F9A537121383A1002747C1 /* string_conversion.cc in Sources */,
+				D2F9A538121383A1002747C1 /* file_id.cc in Sources */,
+				D2F9A539121383A1002747C1 /* macho_id.cc in Sources */,
+				D2F9A53A121383A1002747C1 /* macho_utilities.cc in Sources */,
+				D2F9A53B121383A1002747C1 /* macho_walker.cc in Sources */,
+				D2F9A53C121383A1002747C1 /* string_utilities.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F92C53510ECCE349009BE4BA /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F92C53B80ECCE7B3009BE4BA /* Inspector.mm in Sources */,
@@ -1073,16 +1593,19 @@
 				F9C44EE90EF0A3C1003AEBAA /* GTMLogger.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F93803BB0F80820F004D428B /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				D2F9A4DF12133AD9002747C1 /* crash_generation_client.cc in Sources */,
+				D2F9A4E012133AD9002747C1 /* crash_generation_server.cc in Sources */,
+				D24BBD291211EDB100F3D417 /* MachIPC.mm in Sources */,
 				D2A5DD401188640400081F03 /* breakpad_nlist_64.cc in Sources */,
 				F93803CD0F8083B7004D428B /* dynamic_images.cc in Sources */,
 				F93803CE0F8083B7004D428B /* exception_handler.cc in Sources */,
 				F93803CF0F8083B7004D428B /* minidump_generator.cc in Sources */,
 				F93803D00F8083B7004D428B /* minidump_file_writer.cc in Sources */,
 				F93803D10F8083B7004D428B /* convert_UTF.c in Sources */,
 				F93803D20F8083B7004D428B /* string_conversion.cc in Sources */,
 				F93803D30F8083B7004D428B /* file_id.cc in Sources */,
@@ -1104,29 +1627,32 @@
 				F93DE2D80F82A70E00608B94 /* minidump_file_writer_unittest.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F93DE3290F82C55600608B94 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				D2F9A4E112133AE2002747C1 /* crash_generation_client.cc in Sources */,
+				D2F9A4E212133AE2002747C1 /* crash_generation_server.cc in Sources */,
+				D24BBD321212CACF00F3D417 /* MachIPC.mm in Sources */,
 				D2A5DD411188642E00081F03 /* breakpad_nlist_64.cc in Sources */,
 				F93DE3350F82C66B00608B94 /* dynamic_images.cc in Sources */,
 				F93DE3360F82C66B00608B94 /* exception_handler.cc in Sources */,
 				F93DE3370F82C66B00608B94 /* minidump_generator.cc in Sources */,
 				F93DE3380F82C66B00608B94 /* minidump_file_writer.cc in Sources */,
 				F93DE3390F82C66B00608B94 /* convert_UTF.c in Sources */,
 				F93DE33A0F82C66B00608B94 /* string_conversion.cc in Sources */,
 				F93DE33B0F82C66B00608B94 /* file_id.cc in Sources */,
 				F93DE33C0F82C66B00608B94 /* macho_id.cc in Sources */,
 				F93DE33D0F82C66B00608B94 /* macho_utilities.cc in Sources */,
 				F93DE33E0F82C66B00608B94 /* macho_walker.cc in Sources */,
 				F93DE33F0F82C66B00608B94 /* string_utilities.cc in Sources */,
-				F93DE3410F82C68300608B94 /* exception_handler_test.cc in Sources */,
+				D2F9A3D51212F87C002747C1 /* exception_handler_test.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F9C44DA20EF060A8003AEBAA /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F9C44DB20EF07288003AEBAA /* Controller.m in Sources */,
@@ -1144,16 +1670,61 @@
 				F9C77E130F7DDF810045F7DB /* GTMSenTestCase.m in Sources */,
 				F91AF5D00FD60393009D8BE2 /* BreakpadFramework_Test.mm in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXTargetDependency section */
+		8B31023911F0CF0600FCF3E4 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = all_unittests;
+			targetProxy = 8B31023811F0CF0600FCF3E4 /* PBXContainerItemProxy */;
+		};
+		8B31051711F1010E00FCF3E4 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = F93803BD0F80820F004D428B /* generator_test */;
+			targetProxy = 8B31051611F1010E00FCF3E4 /* PBXContainerItemProxy */;
+		};
+		8B31051911F1010E00FCF3E4 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = F93DE2D00F82A67300608B94 /* minidump_file_writer_unittest */;
+			targetProxy = 8B31051811F1010E00FCF3E4 /* PBXContainerItemProxy */;
+		};
+		8B31051B11F1010E00FCF3E4 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = F93DE32B0F82C55600608B94 /* handler_test */;
+			targetProxy = 8B31051A11F1010E00FCF3E4 /* PBXContainerItemProxy */;
+		};
+		8B31051D11F1010E00FCF3E4 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = macho_dump;
+			targetProxy = 8B31051C11F1010E00FCF3E4 /* PBXContainerItemProxy */;
+		};
+		8B31051F11F1010E00FCF3E4 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = minidump_upload;
+			targetProxy = 8B31051E11F1010E00FCF3E4 /* PBXContainerItemProxy */;
+		};
+		D2F9A44312131F80002747C1 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = D2F9A41412131EF0002747C1 /* gtest */;
+			targetProxy = D2F9A44212131F80002747C1 /* PBXContainerItemProxy */;
+		};
+		D2F9A52B121383A1002747C1 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = D2F9A41412131EF0002747C1 /* gtest */;
+			targetProxy = D2F9A52C121383A1002747C1 /* PBXContainerItemProxy */;
+		};
+		D2F9A5DF12142A6A002747C1 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = D2F9A52A121383A1002747C1 /* crash_generation_server_test */;
+			targetProxy = D2F9A5DE12142A6A002747C1 /* PBXContainerItemProxy */;
+		};
 		F91AF6380FD60A74009D8BE2 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			target = 8DC2EF4F0486A6940098B216 /* Breakpad */;
 			targetProxy = F91AF6370FD60A74009D8BE2 /* PBXContainerItemProxy */;
 		};
 		F92C564E0ECD10E5009BE4BA /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			target = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */;
@@ -1236,24 +1807,46 @@
 		};
 /* End PBXTargetDependency section */
 
 /* Begin PBXVariantGroup section */
 		33880C7E0F9E097100817F82 /* InfoPlist.strings */ = {
 			isa = PBXVariantGroup;
 			children = (
 				33880C7F0F9E097100817F82 /* English */,
+				DE43468711C7295D004F095F /* da */,
+				DE43468611C72958004F095F /* de */,
+				DE43468811C7295F004F095F /* es */,
+				DE43468911C72964004F095F /* fr */,
+				DE43468A11C72967004F095F /* it */,
+				DE43468B11C7296B004F095F /* ja */,
+				DE43468C11C7296D004F095F /* nl */,
+				DE43468D11C7296F004F095F /* no */,
+				DE43468E11C72971004F095F /* sl */,
+				DE43468F11C72973004F095F /* sv */,
+				DE43469011C72976004F095F /* tr */,
 			);
 			name = InfoPlist.strings;
 			sourceTree = "<group>";
 		};
 		F945849C0F280E3C009A47BF /* Localizable.strings */ = {
 			isa = PBXVariantGroup;
 			children = (
 				F945849D0F280E3C009A47BF /* English */,
+				DE43467411C72855004F095F /* da */,
+				DE43467511C72857004F095F /* de */,
+				DE43467611C7285B004F095F /* es */,
+				DE43467711C72862004F095F /* fr */,
+				DE43467811C72869004F095F /* it */,
+				DE43467E11C728DC004F095F /* ja */,
+				DE43467911C7286D004F095F /* nl */,
+				DE43467A11C72873004F095F /* no */,
+				DE43467B11C72877004F095F /* sl */,
+				DE43467C11C7287A004F095F /* sv */,
+				DE43467F11C728E1004F095F /* tr */,
 			);
 			name = Localizable.strings;
 			sourceTree = "<group>";
 		};
 		F9C44DB80EF072A0003AEBAA /* InfoPlist.strings */ = {
 			isa = PBXVariantGroup;
 			children = (
 				F9C44DB90EF072A0003AEBAA /* English */,
@@ -1270,705 +1863,448 @@
 			sourceTree = "<group>";
 		};
 /* End PBXVariantGroup section */
 
 /* Begin XCBuildConfiguration section */
 		1DEB91AE08733DA50010E9CD /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				FRAMEWORK_VERSION = A;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch;
-				HEADER_SEARCH_PATHS = "../..//**";
+				HEADER_SEARCH_PATHS = ../..;
 				INFOPLIST_FILE = Framework/Info.plist;
 				INSTALL_PATH = "@executable_path/../Frameworks";
 				PRODUCT_NAME = Breakpad;
 				WRAPPER_EXTENSION = framework;
 			};
 			name = Debug;
 		};
 		1DEB91AF08733DA50010E9CD /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				FRAMEWORK_VERSION = A;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch;
-				HEADER_SEARCH_PATHS = "../..//**";
+				HEADER_SEARCH_PATHS = ../..;
 				INFOPLIST_FILE = Framework/Info.plist;
 				INSTALL_PATH = "@executable_path/../Frameworks";
 				PRODUCT_NAME = Breakpad;
 				WRAPPER_EXTENSION = framework;
 			};
 			name = Release;
 		};
 		1DEB91B208733DA50010E9CD /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */;
 			buildSettings = {
-				ARCHS = "$(ONLY_ACTIVE_ARCH_PRE_XCODE_3_1)";
-				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				ONLY_ACTIVE_ARCH_PRE_XCODE_3_1 = "$(NATIVE_ARCH_ACTUAL)";
-				PREBINDING = NO;
-				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+				GCC_TREAT_WARNINGS_AS_ERRORS = NO;
 			};
 			name = Debug;
 		};
 		1DEB91B308733DA50010E9CD /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 8B31027811F0D3AF00FCF3E4 /* BreakpadRelease.xcconfig */;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1 = "ppc i386";
-				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				HEADER_SEARCH_PATHS = "../..//**";
+				GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+			};
+			name = Release;
+		};
+		D2F9A41612131EF0002747C1 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				HEADER_SEARCH_PATHS = (
+					$inherited,
+					../../testing,
+					../../testing/include,
+					../../testing/gtest,
+					../../testing/gtest/include,
+				);
+				PREBINDING = NO;
+				PRODUCT_NAME = gtest;
+			};
+			name = Debug;
+		};
+		D2F9A41712131EF0002747C1 /* Debug With Code Coverage */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				PREBINDING = NO;
+				PRODUCT_NAME = gtest;
+			};
+			name = "Debug With Code Coverage";
+		};
+		D2F9A41812131EF0002747C1 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				COPY_PHASE_STRIP = YES;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				PREBINDING = NO;
-				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+				PRODUCT_NAME = gtest;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		D2F9A543121383A1002747C1 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				HEADER_SEARCH_PATHS = (
+					../..,
+					../../testing,
+					../../testing/include,
+					../../testing/gtest,
+					../../testing/gtest/include,
+				);
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(SRCROOT)/build/Debug\"",
+				);
+				PRODUCT_NAME = crash_generation_server_test;
+			};
+			name = Debug;
+		};
+		D2F9A544121383A1002747C1 /* Debug With Code Coverage */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				HEADER_SEARCH_PATHS = ../..;
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"\\\"$(SRCROOT)/build/Debug\\\"",
+				);
+				PRODUCT_NAME = handler_test;
+			};
+			name = "Debug With Code Coverage";
+		};
+		D2F9A545121383A1002747C1 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				HEADER_SEARCH_PATHS = ../..;
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"\\\"$(SRCROOT)/build/Debug\\\"",
+				);
+				PRODUCT_NAME = handler_test;
 			};
 			name = Release;
 		};
 		F92C53560ECCE34A009BE4BA /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				HEADER_SEARCH_PATHS = "../..//**";
-				INSTALL_PATH = /usr/local/bin;
-				OTHER_LDFLAGS = (
-					"-lcrypto",
-					"$(inherited)",
-				);
-				PREBINDING = NO;
+				HEADER_SEARCH_PATHS = ../..;
 				PRODUCT_NAME = Inspector;
 			};
 			name = Debug;
 		};
 		F92C53570ECCE34A009BE4BA /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = YES;
-				DEAD_CODE_STRIPPING = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				HEADER_SEARCH_PATHS = "../..//**";
-				INSTALL_PATH = /usr/local/bin;
-				LD_GENERATE_MAP_FILE = YES;
-				OTHER_LDFLAGS = (
-					"$(inherited)",
-					"-lcrypto",
-				);
-				PREBINDING = NO;
+				HEADER_SEARCH_PATHS = ../..;
 				PRODUCT_NAME = Inspector;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F92C563D0ECD10B3009BE4BA /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				HEADER_SEARCH_PATHS = "../..//**";
-				INSTALL_PATH = /usr/local/lib;
+				HEADER_SEARCH_PATHS = ../..;
 				LD_DYLIB_INSTALL_NAME = "@executable_path/../Resources/$(EXECUTABLE_PATH)";
 				OTHER_LDFLAGS = (
 					"$(inherited)",
 					"-headerpad_max_install_names",
-					"-lcrypto",
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = breakpadUtilities;
 			};
 			name = Debug;
 		};
 		F92C563E0ECD10B3009BE4BA /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				HEADER_SEARCH_PATHS = "../..//**";
-				INSTALL_PATH = /usr/local/lib;
+				HEADER_SEARCH_PATHS = ../..;
 				LD_DYLIB_INSTALL_NAME = "@executable_path/../Resources/$(EXECUTABLE_PATH)";
 				OTHER_LDFLAGS = (
 					"$(inherited)",
 					"-headerpad_max_install_names",
-					"-lcrypto",
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = breakpadUtilities;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F92C56A30ECE04A8009BE4BA /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				HEADER_SEARCH_PATHS = "../..//**";
+				HEADER_SEARCH_PATHS = ../..;
 				INFOPLIST_FILE = "sender/crash_report_sender-Info.plist";
-				INSTALL_PATH = "$(HOME)/Applications";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = crash_report_sender;
 			};
 			name = Debug;
 		};
 		F92C56A40ECE04A8009BE4BA /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				HEADER_SEARCH_PATHS = "../..//**";
+				HEADER_SEARCH_PATHS = ../..;
 				INFOPLIST_FILE = "sender/crash_report_sender-Info.plist";
-				INSTALL_PATH = "$(HOME)/Applications";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = crash_report_sender;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F93803C00F808210004D428B /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				INSTALL_PATH = /usr/local/bin;
-				OTHER_LDFLAGS = (
-					"-lcrypto",
-					"-framework",
-					Foundation,
-				);
-				PREBINDING = NO;
+				HEADER_SEARCH_PATHS = ../..;
 				PRODUCT_NAME = generator_test;
-				USER_HEADER_SEARCH_PATHS = ../../;
 			};
 			name = Debug;
 		};
 		F93803C10F808210004D428B /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_MODEL_TUNING = G5;
-				INSTALL_PATH = /usr/local/bin;
-				OTHER_LDFLAGS = (
-					"-lcrypto",
-					"-framework",
-					Foundation,
-				);
-				PREBINDING = NO;
+				HEADER_SEARCH_PATHS = ../..;
 				PRODUCT_NAME = generator_test;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F93DE2D30F82A67400608B94 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				GCC_CHAR_IS_UNSIGNED_CHAR = YES;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				INSTALL_PATH = /usr/local/bin;
-				OTHER_LDFLAGS = (
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
+				HEADER_SEARCH_PATHS = ../..;
 				PRODUCT_NAME = minidump_file_writer_unittest;
-				USER_HEADER_SEARCH_PATHS = ../../;
 			};
 			name = Debug;
 		};
 		F93DE2D40F82A67400608B94 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_MODEL_TUNING = G5;
-				INSTALL_PATH = /usr/local/bin;
-				OTHER_LDFLAGS = (
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
+				HEADER_SEARCH_PATHS = ../..;
 				PRODUCT_NAME = minidump_file_writer_unittest;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F93DE32E0F82C55700608B94 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				INSTALL_PATH = /usr/local/bin;
-				OTHER_LDFLAGS = (
-					"-lcrypto",
-					"-framework",
-					Foundation,
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				HEADER_SEARCH_PATHS = (
+					../..,
+					../../testing,
+					../../testing/include,
+					../../testing/gtest,
+					../../testing/gtest/include,
 				);
-				PREBINDING = NO;
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(SRCROOT)/build/Debug\"",
+				);
 				PRODUCT_NAME = handler_test;
-				USER_HEADER_SEARCH_PATHS = ../../;
 			};
 			name = Debug;
 		};
 		F93DE32F0F82C55700608B94 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_MODEL_TUNING = G5;
-				INSTALL_PATH = /usr/local/bin;
-				OTHER_LDFLAGS = (
-					"-lcrypto",
-					"-framework",
-					Foundation,
+				HEADER_SEARCH_PATHS = ../..;
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(SRCROOT)/build/Debug\"",
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = handler_test;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F93DE3B90F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */;
 			buildSettings = {
-				ARCHS = "$(ONLY_ACTIVE_ARCH_PRE_XCODE_3_1)";
-				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				ONLY_ACTIVE_ARCH_PRE_XCODE_3_1 = "$(NATIVE_ARCH)";
-				PREBINDING = NO;
-				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+				GCC_TREAT_WARNINGS_AS_ERRORS = NO;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F93DE3BA0F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				FRAMEWORK_VERSION = A;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch;
-				HEADER_SEARCH_PATHS = "../..//**";
+				HEADER_SEARCH_PATHS = ../..;
 				INFOPLIST_FILE = Framework/Info.plist;
 				INSTALL_PATH = "@executable_path/../Frameworks";
 				PRODUCT_NAME = Breakpad;
 				WRAPPER_EXTENSION = framework;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F93DE3BB0F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				HEADER_SEARCH_PATHS = "../..//**";
-				INSTALL_PATH = /usr/local/bin;
-				OTHER_LDFLAGS = (
-					"-lcrypto",
-					"$(inherited)",
-				);
-				PREBINDING = NO;
+				HEADER_SEARCH_PATHS = ../..;
 				PRODUCT_NAME = Inspector;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F93DE3BC0F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				HEADER_SEARCH_PATHS = "../..//**";
-				INSTALL_PATH = /usr/local/lib;
+				HEADER_SEARCH_PATHS = ../..;
 				LD_DYLIB_INSTALL_NAME = "@executable_path/../Resources/$(EXECUTABLE_PATH)";
 				OTHER_LDFLAGS = (
 					"$(inherited)",
 					"-headerpad_max_install_names",
-					"-lcrypto",
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = breakpadUtilities;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F93DE3BD0F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				HEADER_SEARCH_PATHS = "../..//**";
+				HEADER_SEARCH_PATHS = ../..;
 				INFOPLIST_FILE = "sender/crash_report_sender-Info.plist";
-				INSTALL_PATH = "$(HOME)/Applications";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = crash_report_sender;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F93DE3BE0F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
 				FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/build/$(CONFIGURATION)";
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
 				INFOPLIST_FILE = testapp/Info.plist;
-				INSTALL_PATH = "$(HOME)/Applications";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = BreakpadTest;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F93DE3BF0F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_OPTIMIZATION_LEVEL = 0;
 				PRODUCT_NAME = All;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F93DE3C00F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_DYNAMIC_NO_PIC = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(DEVELOPER_FRAMEWORKS_DIR)\"",
+				);
 				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
-				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h";
+				HEADER_SEARCH_PATHS = ../..;
 				INFOPLIST_FILE = "UnitTests-Info.plist";
-				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
-				LIBRARY_SEARCH_PATHS = ./gcov;
-				OTHER_LDFLAGS = (
-					"-lgcov",
-					"-framework",
-					Cocoa,
-					"-framework",
-					SenTestingKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = UnitTests;
-				USER_HEADER_SEARCH_PATHS = "../../ ../../common/mac/**";
 				WRAPPER_EXTENSION = octest;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F93DE3C10F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
-				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				INSTALL_PATH = /usr/local/bin;
-				LIBRARY_SEARCH_PATHS = ./gcov;
-				OTHER_LDFLAGS = (
-					"-lgcov",
-					"-lcrypto",
-					"-framework",
-					Foundation,
-				);
-				PREBINDING = NO;
+				HEADER_SEARCH_PATHS = ../..;
 				PRODUCT_NAME = generator_test;
-				USER_HEADER_SEARCH_PATHS = ../../;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F93DE3C20F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				GCC_CHAR_IS_UNSIGNED_CHAR = YES;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
-				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				INSTALL_PATH = /usr/local/bin;
-				LIBRARY_SEARCH_PATHS = ./gcov;
-				OTHER_LDFLAGS = (
-					"-lgcov",
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
+				HEADER_SEARCH_PATHS = ../..;
 				PRODUCT_NAME = minidump_file_writer_unittest;
-				USER_HEADER_SEARCH_PATHS = ../../;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F93DE3C30F830E7000608B94 /* Debug With Code Coverage */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
-				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				INSTALL_PATH = /usr/local/bin;
-				LIBRARY_SEARCH_PATHS = ./gcov;
-				OTHER_LDFLAGS = (
-					"-lcrypto",
-					"-lgcov",
-					"-framework",
-					Foundation,
+				HEADER_SEARCH_PATHS = ../..;
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(SRCROOT)/build/Debug\"",
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = handler_test;
-				USER_HEADER_SEARCH_PATHS = ../../;
 			};
 			name = "Debug With Code Coverage";
 		};
 		F94585850F782326009A47BF /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_OPTIMIZATION_LEVEL = 0;
 				PRODUCT_NAME = All;
 			};
 			name = Debug;
 		};
 		F94585860F782326009A47BF /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				PRODUCT_NAME = All;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F9C44DA80EF060A8003AEBAA /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
 				FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/build/$(CONFIGURATION)";
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
 				INFOPLIST_FILE = testapp/Info.plist;
-				INSTALL_PATH = "$(HOME)/Applications";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = BreakpadTest;
 			};
 			name = Debug;
 		};
 		F9C44DA90EF060A8003AEBAA /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/build/$(CONFIGURATION)";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				INFOPLIST_FILE = testapp/Info.plist;
-				INSTALL_PATH = "$(HOME)/Applications";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = BreakpadTest;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F9C77DDC0F7DD5D00045F7DB /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_DYNAMIC_NO_PIC = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(DEVELOPER_FRAMEWORKS_DIR)\"",
+				);
 				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h";
 				INFOPLIST_FILE = "UnitTests-Info.plist";
-				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Cocoa,
-					"-framework",
-					SenTestingKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = UnitTests;
-				USER_HEADER_SEARCH_PATHS = "../../ ../../common/mac/**";
 				WRAPPER_EXTENSION = octest;
 			};
 			name = Debug;
 		};
 		F9C77DDD0F7DD5D00045F7DB /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(DEVELOPER_FRAMEWORKS_DIR)\"",
+				);
 				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_MODEL_TUNING = G5;
 				INFOPLIST_FILE = "UnitTests-Info.plist";
-				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Cocoa,
-					"-framework",
-					SenTestingKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = UnitTests;
 				WRAPPER_EXTENSION = octest;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
 		1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Breakpad" */ = {
 			isa = XCConfigurationList;
@@ -1985,16 +2321,36 @@
 			buildConfigurations = (
 				1DEB91B208733DA50010E9CD /* Debug */,
 				F93DE3B90F830E7000608B94 /* Debug With Code Coverage */,
 				1DEB91B308733DA50010E9CD /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
+		D2F9A42D12131F0E002747C1 /* Build configuration list for PBXNativeTarget "gtest" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				D2F9A41612131EF0002747C1 /* Debug */,
+				D2F9A41712131EF0002747C1 /* Debug With Code Coverage */,
+				D2F9A41812131EF0002747C1 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		D2F9A542121383A1002747C1 /* Build configuration list for PBXNativeTarget "crash_generation_server_test" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				D2F9A543121383A1002747C1 /* Debug */,
+				D2F9A544121383A1002747C1 /* Debug With Code Coverage */,
+				D2F9A545121383A1002747C1 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
 		F92C53580ECCE36D009BE4BA /* Build configuration list for PBXNativeTarget "Inspector" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				F92C53560ECCE34A009BE4BA /* Debug */,
 				F93DE3BB0F830E7000608B94 /* Debug With Code Coverage */,
 				F92C53570ECCE34A009BE4BA /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.h
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.h
@@ -105,26 +105,29 @@ typedef bool (*BreakpadFilterCallback)(i
 // Create a new BreakpadRef object and install it as an exception
 // handler.  The |parameters| will typically be the contents of your
 // bundle's Info.plist.
 //
 // You can also specify these additional keys for customizable behavior:
 // Key:                           Value:
 // BREAKPAD_PRODUCT               Product name (e.g., "MyAwesomeProduct")
 //                                This one is used as the key to identify
-//                                the product when uploading
+//                                the product when uploading. Falls back to
+//                                CFBundleName if not specified.
 //                                REQUIRED
 //
 // BREAKPAD_PRODUCT_DISPLAY       This is the display name, e.g. a pretty
 //                                name for the product when the crash_sender
-//                                pops up UI for the user.  Falls back to
+//                                pops up UI for the user. Falls back first to
+//                                CFBundleDisplayName and then to
 //                                BREAKPAD_PRODUCT if not specified.
 //
 // BREAKPAD_VERSION               Product version (e.g., 1.2.3), used
-//                                as metadata for crash report
+//                                as metadata for crash report. Falls back to
+//                                CFBundleVersion if not specified.
 //                                REQUIRED
 //
 // BREAKPAD_VENDOR                Vendor name, used in UI (e.g. "A report has
 //                                been created that you can send to <vendor>")
 //
 // BREAKPAD_URL                   URL destination for reporting
 //                                REQUIRED
 //
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.mm
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.mm
@@ -50,16 +50,20 @@
 
 #import <sys/stat.h>
 #import <sys/sysctl.h>
 
 #import <Foundation/Foundation.h>
 
 
 using google_breakpad::KeyValueEntry;
+using google_breakpad::MachPortSender;
+using google_breakpad::MachReceiveMessage;
+using google_breakpad::MachSendMessage;
+using google_breakpad::ReceivePort;
 using google_breakpad::SimpleStringDictionary;
 using google_breakpad::SimpleStringDictionaryIterator;
 
 //=============================================================================
 // We want any memory allocations which are used by breakpad during the
 // exception handling process (after a crash has happened) to be read-only
 // to prevent them from being smashed before a crash occurs.  Unfortunately
 // we cannot protect against smashes to our exception handling thread's
@@ -159,17 +163,17 @@ class Breakpad {
     filter_callback_context_ = context;
   }
 
  private:
   Breakpad()
     : handler_(NULL),
       config_params_(NULL),
       send_and_exit_(true),
-      filter_callback_(NULL), 
+      filter_callback_(NULL),
       filter_callback_context_(NULL) {
     inspector_path_[0] = 0;
   }
 
   bool Initialize(NSDictionary *parameters);
 
   bool ExtractParameters(NSDictionary *parameters);
 
@@ -260,17 +264,17 @@ bool Breakpad::ExceptionHandlerDirectCal
                                     exception_code,
                                     exception_subcode,
                                     crashing_thread);
 }
 
 //=============================================================================
 #pragma mark -
 
-#include <mach-o/dyld.h>
+#include <dlfcn.h>
 
 //=============================================================================
 // Returns the pathname to the Resources directory for this version of
 // Breakpad which we are now running.
 //
 // Don't make the function static, since _dyld_lookup_and_bind_fully needs a
 // simple non-static C name
 //
@@ -281,38 +285,31 @@ NSString * GetResourcePath() {
 
   // If there are multiple breakpads installed then calling bundleWithIdentifier
   // will not work properly, so only use that as a backup plan.
   // We want to find the bundle containing the code where this function lives
   // and work from there
   //
 
   // Get the pathname to the code which contains this function
-  void *address = nil;
-  NSModule module = nil;
-  _dyld_lookup_and_bind_fully("_GetResourcePath",
-                              &address,
-                              &module);
-
-  if (module && address) {
-    const char* moduleName = NSNameOfModule(module);
-    if (moduleName) {
-      // The "Resources" directory should be in the same directory as the
-      // executable code, since that's how the Breakpad framework is built.
-      resourcePath = [NSString stringWithUTF8String:moduleName];
-      resourcePath = [resourcePath stringByDeletingLastPathComponent];
-      resourcePath = [resourcePath stringByAppendingPathComponent:@"Resources/"];
-     } else {
-      DEBUGLOG(stderr, "Missing moduleName\n");
-    }
+  Dl_info info;
+  if (dladdr((const void*)GetResourcePath, &info) != 0) {
+    NSFileManager *filemgr = [NSFileManager defaultManager];
+    NSString *filePath =
+        [filemgr stringWithFileSystemRepresentation:info.dli_fname
+                                             length:strlen(info.dli_fname)];
+    NSString *bundlePath = [filePath stringByDeletingLastPathComponent];
+    // The "Resources" directory should be in the same directory as the
+    // executable code, since that's how the Breakpad framework is built.
+    resourcePath = [bundlePath stringByAppendingPathComponent:@"Resources/"];
   } else {
     DEBUGLOG(stderr, "Could not find GetResourcePath\n");
     // fallback plan
     NSBundle *bundle =
-      [NSBundle bundleWithIdentifier:@"com.Google.BreakpadFramework"];
+        [NSBundle bundleWithIdentifier:@"com.Google.BreakpadFramework"];
     resourcePath = [bundle resourcePath];
   }
 
   return resourcePath;
 }
 }  // extern "C"
 
 //=============================================================================
@@ -366,19 +363,20 @@ bool Breakpad::Initialize(NSDictionary *
                                            true);        // shutdown on exit
 
   if (kr != KERN_SUCCESS) {
     return false;
   }
 
   // Create the handler (allocating it in our special protected pool)
   handler_ =
-    new (gBreakpadAllocator->Allocate(sizeof(google_breakpad::ExceptionHandler)))
-      google_breakpad::ExceptionHandler(
-        Breakpad::ExceptionHandlerDirectCallback, this, true);
+      new (gBreakpadAllocator->Allocate(
+          sizeof(google_breakpad::ExceptionHandler)))
+          google_breakpad::ExceptionHandler(
+              Breakpad::ExceptionHandlerDirectCallback, this, true);
   return true;
 }
 
 //=============================================================================
 Breakpad::~Breakpad() {
   // Note that we don't use operator delete() on these pointers,
   // since they were allocated by ProtectedMemoryAllocator objects.
   //
@@ -398,46 +396,51 @@ bool Breakpad::ExtractParameters(NSDicti
 
   NSString *serverType = [parameters objectForKey:@BREAKPAD_SERVER_TYPE];
   NSString *display = [parameters objectForKey:@BREAKPAD_PRODUCT_DISPLAY];
   NSString *product = [parameters objectForKey:@BREAKPAD_PRODUCT];
   NSString *version = [parameters objectForKey:@BREAKPAD_VERSION];
   NSString *urlStr = [parameters objectForKey:@BREAKPAD_URL];
   NSString *interval = [parameters objectForKey:@BREAKPAD_REPORT_INTERVAL];
   NSString *inspectorPathString =
-                [parameters objectForKey:@BREAKPAD_INSPECTOR_LOCATION];
+      [parameters objectForKey:@BREAKPAD_INSPECTOR_LOCATION];
   NSString *reporterPathString =
-                [parameters objectForKey:@BREAKPAD_REPORTER_EXE_LOCATION];
+      [parameters objectForKey:@BREAKPAD_REPORTER_EXE_LOCATION];
   NSString *timeout = [parameters objectForKey:@BREAKPAD_CONFIRM_TIMEOUT];
   NSArray  *logFilePaths = [parameters objectForKey:@BREAKPAD_LOGFILES];
-  NSString *logFileTailSize = [parameters objectForKey:@BREAKPAD_LOGFILE_UPLOAD_SIZE];
+  NSString *logFileTailSize =
+      [parameters objectForKey:@BREAKPAD_LOGFILE_UPLOAD_SIZE];
   NSString *requestUserText =
-                [parameters objectForKey:@BREAKPAD_REQUEST_COMMENTS];
+      [parameters objectForKey:@BREAKPAD_REQUEST_COMMENTS];
   NSString *requestEmail = [parameters objectForKey:@BREAKPAD_REQUEST_EMAIL];
   NSString *vendor =
-    [parameters objectForKey:@BREAKPAD_VENDOR];
+      [parameters objectForKey:@BREAKPAD_VENDOR];
   NSString *dumpSubdirectory =
-    [parameters objectForKey:@BREAKPAD_DUMP_DIRECTORY];
+      [parameters objectForKey:@BREAKPAD_DUMP_DIRECTORY];
 
-  NSDictionary *serverParameters = 
-    [parameters objectForKey:@BREAKPAD_SERVER_PARAMETER_DICT];
+  NSDictionary *serverParameters =
+      [parameters objectForKey:@BREAKPAD_SERVER_PARAMETER_DICT];
 
   // These may have been set above as user prefs, which take priority.
   if (!skipConfirm) {
     skipConfirm = [parameters objectForKey:@BREAKPAD_SKIP_CONFIRM];
   }
   if (!sendAndExit) {
     sendAndExit = [parameters objectForKey:@BREAKPAD_SEND_AND_EXIT];
   }
 
   if (!product)
     product = [parameters objectForKey:@"CFBundleName"];
 
-  if (!display)
-    display = product;
+  if (!display) {
+    display = [parameters objectForKey:@"CFBundleDisplayName"];
+    if (!display) {
+      display = product;
+    }
+  }
 
   if (!version)
     version = [parameters objectForKey:@"CFBundleVersion"];
 
   if (!interval)
     interval = @"3600";
 
   if (!timeout)
@@ -507,18 +510,20 @@ bool Breakpad::ExtractParameters(NSDicti
   if (![[NSFileManager defaultManager] fileExistsAtPath:inspectorPathString]) {
     DEBUGLOG(stderr, "Cannot find Inspector tool\n");
     return false;
   }
 
   // Find Reporter.
   if (!reporterPathString) {
     reporterPathString =
-      [resourcePath stringByAppendingPathComponent:@"crash_report_sender.app"];
-    reporterPathString = [[NSBundle bundleWithPath:reporterPathString] executablePath];
+        [resourcePath
+         stringByAppendingPathComponent:@"crash_report_sender.app"];
+    reporterPathString =
+        [[NSBundle bundleWithPath:reporterPathString] executablePath];
   }
 
   // Verify that there is a Reporter application.
   if (![[NSFileManager defaultManager]
              fileExistsAtPath:reporterPathString]) {
     DEBUGLOG(stderr, "Cannot find Reporter tool\n");
     return false;
   }
@@ -553,32 +558,32 @@ bool Breakpad::ExtractParameters(NSDicti
   dictionary.SetKeyValue(BREAKPAD_PRODUCT_DISPLAY, [display UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_PRODUCT,         [product UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_VERSION,         [version UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_URL,             [urlStr UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_REPORT_INTERVAL, [interval UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_SKIP_CONFIRM,    [skipConfirm UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_CONFIRM_TIMEOUT, [timeout UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_INSPECTOR_LOCATION,
-                           [inspectorPathString fileSystemRepresentation]);
+                         [inspectorPathString fileSystemRepresentation]);
   dictionary.SetKeyValue(BREAKPAD_REPORTER_EXE_LOCATION,
-                           [reporterPathString fileSystemRepresentation]);
+                         [reporterPathString fileSystemRepresentation]);
   dictionary.SetKeyValue(BREAKPAD_LOGFILE_UPLOAD_SIZE,
                          [logFileTailSize UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_REQUEST_COMMENTS,
                          [requestUserText UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_REQUEST_EMAIL, [requestEmail UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_VENDOR, [vendor UTF8String]);
   dictionary.SetKeyValue(BREAKPAD_DUMP_DIRECTORY,
                          [dumpSubdirectory UTF8String]);
-  
+
   struct timeval tv;
   gettimeofday(&tv, NULL);
   char timeStartedString[32];
-  sprintf(timeStartedString, "%d", tv.tv_sec);
+  sprintf(timeStartedString, "%zd", tv.tv_sec);
   dictionary.SetKeyValue(BREAKPAD_PROCESS_START_TIME,
                          timeStartedString);
 
   if (logFilePaths) {
     char logFileKey[255];
     for(unsigned int i = 0; i < [logFilePaths count]; i++) {
       sprintf(logFileKey,"%s%d", BREAKPAD_LOGFILE_KEY_PREFIX, i);
       dictionary.SetKeyValue(logFileKey,
@@ -586,62 +591,61 @@ bool Breakpad::ExtractParameters(NSDicti
                                fileSystemRepresentation]);
     }
   }
 
   if (serverParameters) {
     // For each key-value pair, call BreakpadAddUploadParameter()
     NSEnumerator *keyEnumerator = [serverParameters keyEnumerator];
     NSString *aParameter;
-    while (aParameter = [keyEnumerator nextObject]) {
+    while ((aParameter = [keyEnumerator nextObject])) {
       BreakpadAddUploadParameter(this, aParameter,
 				 [serverParameters objectForKey:aParameter]);
     }
   }
   return true;
 }
 
 //=============================================================================
-void        Breakpad::SetKeyValue(NSString *key, NSString *value) {
+void Breakpad::SetKeyValue(NSString *key, NSString *value) {
   // We allow nil values. This is the same as removing the keyvalue.
   if (!config_params_ || !key)
     return;
 
   config_params_->SetKeyValue([key UTF8String], [value UTF8String]);
 }
 
 //=============================================================================
-NSString *  Breakpad::KeyValue(NSString *key) {
+NSString *Breakpad::KeyValue(NSString *key) {
   if (!config_params_ || !key)
     return nil;
 
   const char *value = config_params_->GetValueForKey([key UTF8String]);
   return value ? [NSString stringWithUTF8String:value] : nil;
 }
 
 //=============================================================================
-void        Breakpad::RemoveKeyValue(NSString *key) {
-  if (!config_params_ || !key)
-    return;
+void Breakpad::RemoveKeyValue(NSString *key) {
+  if (!config_params_ || !key) return;
 
   config_params_->RemoveKey([key UTF8String]);
 }
 
 //=============================================================================
-void        Breakpad::GenerateAndSendReport() {
+void Breakpad::GenerateAndSendReport() {
   config_params_->SetKeyValue(BREAKPAD_ON_DEMAND, "YES");
-  HandleException(0, 0, 0, mach_thread_self()); 
+  HandleException(0, 0, 0, mach_thread_self());
   config_params_->SetKeyValue(BREAKPAD_ON_DEMAND, "NO");
 }
 
 //=============================================================================
-bool Breakpad::HandleException(int           exception_type,
-                               int           exception_code,
-                               int           exception_subcode,
-                               mach_port_t   crashing_thread) {
+bool Breakpad::HandleException(int exception_type,
+                               int exception_code,
+                               int exception_subcode,
+                               mach_port_t crashing_thread) {
   DEBUGLOG(stderr, "Breakpad: an exception occurred\n");
 
   if (filter_callback_) {
     bool should_handle = filter_callback_(exception_type,
                                           exception_code,
                                           crashing_thread,
                                           filter_callback_context_);
     if (!should_handle) return false;
@@ -707,18 +711,17 @@ bool Breakpad::HandleException(int      
 #if VERBOSE
   PRINT_MACH_RESULT(result, "Breakpad: SendMessage ");
   printf("Breakpad: Inspector service port = %#x\n",
     inspector_.GetServicePort());
 #endif
 
   // If we don't want any forwarding, return true here to indicate that we've
   // processed things as much as we want.
-  if (send_and_exit_)
-    return true;
+  if (send_and_exit_) return true;
 
   return false;
 }
 
 //=============================================================================
 //=============================================================================
 
 #pragma mark -
@@ -734,21 +737,21 @@ BreakpadRef BreakpadCreate(NSDictionary 
     //
     // But in order to avoid these two allocators themselves from being smashed,
     // we'll protect them as well by allocating them with gMasterAllocator.
     //
     // gMasterAllocator itself will NOT be protected, but this doesn't matter,
     // since once it does its allocations and locks the memory, smashes to itself
     // don't affect anything we care about.
     gMasterAllocator =
-      new ProtectedMemoryAllocator(sizeof(ProtectedMemoryAllocator) * 2);
+        new ProtectedMemoryAllocator(sizeof(ProtectedMemoryAllocator) * 2);
 
     gKeyValueAllocator =
-      new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator)))
-        ProtectedMemoryAllocator(sizeof(SimpleStringDictionary));
+        new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator)))
+            ProtectedMemoryAllocator(sizeof(SimpleStringDictionary));
 
     // Create a mutex for use in accessing the SimpleStringDictionary
     int mutexResult = pthread_mutex_init(&gDictionaryMutex, NULL);
     if (mutexResult == 0) {
 
       // With the current compiler, gBreakpadAllocator is allocating 1444 bytes.
       // Let's round up to the nearest page size.
       //
@@ -756,18 +759,18 @@ BreakpadRef BreakpadCreate(NSDictionary 
 
       /*
        sizeof(Breakpad)
        + sizeof(google_breakpad::ExceptionHandler)
        + sizeof( STUFF ALLOCATED INSIDE ExceptionHandler )
        */
 
       gBreakpadAllocator =
-        new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator)))
-          ProtectedMemoryAllocator(breakpad_pool_size);
+          new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator)))
+              ProtectedMemoryAllocator(breakpad_pool_size);
 
       // Stack-based autorelease pool for Breakpad::Create() obj-c code.
       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
       Breakpad *breakpad = Breakpad::Create(parameters);
 
       if (breakpad) {
         // Make read-only to protect against memory smashers
         gMasterAllocator->Protect();
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.mm
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.mm
@@ -111,17 +111,17 @@ OnDemandServer::~OnDemandServer() {
 }
 
 //==============================================================================
 void OnDemandServer::LaunchOnDemand() {
   // We need to do this, since the launched server is another process
   // and holding on to this port delays launching until the current process
   // exits!
   mach_port_deallocate(mach_task_self(), server_port_);
-  server_port_ = NULL;
+  server_port_ = MACH_PORT_DEAD;
 
   // Now, the service is still registered and all we need to do is send
   // a mach message to the service port in order to launch the server.
 }
 
 //==============================================================================
 void OnDemandServer::Unregister() {
   if (service_port_ != MACH_PORT_NULL) {
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.mm
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.mm
@@ -39,16 +39,18 @@
 #import "client/mac/crash_generation/Inspector.h"
 
 #import "client/mac/Framework/Breakpad.h"
 #import "client/mac/handler/minidump_generator.h"
 
 #import "common/mac/SimpleStringDictionary.h"
 #import "common/mac/MachIPC.h"
 
+#import "GTMDefines.h"
+
 #import <Foundation/Foundation.h>
 
 #if VERBOSE
   bool gDebugLog = true;
 #else
   bool gDebugLog = false;
 #endif
 
@@ -86,24 +88,24 @@ static BOOL EnsureDirectoryPathExists(NS
 
   // If everything is good
   if ([common isEqualToString:dirPath])
     return YES;
 
   // Break up the difference into components
   NSString *diff = [dirPath substringFromIndex:[common length] + 1];
   NSArray *components = [diff pathComponents];
-  unsigned count = [components count];
+  NSUInteger count = [components count];
 
   // Rebuild the path one component at a time
   NSDictionary *attrs =
     [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedLong:0750]
                                 forKey:NSFilePosixPermissions];
   path = common;
-  for (unsigned i = 0; i < count; ++i) {
+  for (NSUInteger i = 0; i < count; ++i) {
     path = [path stringByAppendingPathComponent:[components objectAtIndex:i]];
 
     if (![mgr createDirectoryAtPath:path attributes:attrs])
       return NO;
   }
 
   return YES;
 }
@@ -324,22 +326,22 @@ kern_return_t Inspector::ReadMessages() 
     // coming through correctly.  Since we don't know what parameters
     // we've missed, we can't do much besides abort the crash dump
     // situation in this case.
     unsigned int parameters_read = 0;
     // The initial message contains the number of key value pairs that
     // we are expected to read.
     // Read each key/value pair, one mach message per key/value pair.
     for (unsigned int i = 0; i < info.parameter_count; ++i) {
-      MachReceiveMessage message;
-      result = receive_port.WaitForMessage(&message, 1000);
+      MachReceiveMessage parameter_message;
+      result = receive_port.WaitForMessage(&parameter_message, 1000);
 
       if(result == KERN_SUCCESS) {
         KeyValueMessageData &key_value_data =
-          (KeyValueMessageData&)*message.GetData();
+          (KeyValueMessageData&)*parameter_message.GetData();
         // If we get a blank key, make sure we don't increment the
         // parameter count; in some cases (notably on-demand generation
         // many times in a short period of time) caused the Mach IPC
         // messages to not come through correctly.
         if (strlen(key_value_data.key) == 0) {
           continue;
         }
         parameters_read++;
@@ -371,21 +373,21 @@ void Inspector::SetCrashTimeParameters()
   char processUptimeString[32], processCrashtimeString[32];
   const char *processStartTimeString =
     config_params_.GetValueForKey(BREAKPAD_PROCESS_START_TIME);
 
   // Set up time if we've received the start time.
   if (processStartTimeString) {
     time_t processStartTime = strtol(processStartTimeString, NULL, 10);
     time_t processUptime = tv.tv_sec - processStartTime;
-    sprintf(processUptimeString, "%d", processUptime);
+    sprintf(processUptimeString, "%zd", processUptime);
     config_params_.SetKeyValue(BREAKPAD_PROCESS_UP_TIME, processUptimeString);
   }
 
-  sprintf(processCrashtimeString, "%d", tv.tv_sec);
+  sprintf(processCrashtimeString, "%zd", tv.tv_sec);
   config_params_.SetKeyValue(BREAKPAD_PROCESS_CRASH_TIME,
                              processCrashtimeString);
 }
 
 bool Inspector::InspectTask() {
   // keep the task quiet while we're looking at it
   task_suspend(remote_task_);
   DEBUGLOG(stderr, "Suspended Remote task\n");
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/client_info.h
@@ -0,0 +1,47 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_
+#define CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_
+
+namespace google_breakpad {
+
+class ClientInfo {
+ public:
+  explicit ClientInfo(pid_t pid) : pid_(pid) {}
+
+  pid_t pid() const { return pid_; }
+
+ private:
+  pid_t pid_;
+};
+
+}  // namespace google_breakpad
+
+#endif  // CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_client.cc
@@ -0,0 +1,73 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "client/mac/crash_generation/crash_generation_client.h"
+
+#include "client/mac/crash_generation/crash_generation_server.h"
+#include "common/mac/MachIPC.h"
+
+namespace google_breakpad {
+
+bool CrashGenerationClient::RequestDumpForException(
+    int exception_type,
+    int exception_code,
+    int exception_subcode,
+    mach_port_t crashing_thread) {
+  // The server will send a message to this port indicating that it
+  // has finished its work.
+  ReceivePort acknowledge_port;
+
+  MachSendMessage message(kDumpRequestMessage);
+  message.AddDescriptor(mach_task_self());            // this task
+  message.AddDescriptor(crashing_thread);             // crashing thread
+  message.AddDescriptor(mach_thread_self());          // handler thread
+  message.AddDescriptor(acknowledge_port.GetPort());  // message receive port
+
+  ExceptionInfo info;
+  info.exception_type = exception_type;
+  info.exception_code = exception_code;
+  info.exception_subcode = exception_subcode;
+  message.SetData(&info, sizeof(info));
+  
+  const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000;
+  kern_return_t result = sender_.SendMessage(message, kSendTimeoutMs);
+  if (result != KERN_SUCCESS)
+    return false;
+
+  // Give the server slightly longer to reply since it has to
+  // inspect this task and write the minidump.
+  const mach_msg_timeout_t kReceiveTimeoutMs = 5 * 1000;
+  MachReceiveMessage acknowledge_message;
+  result = acknowledge_port.WaitForMessage(&acknowledge_message,
+					   kReceiveTimeoutMs);
+  
+  return result == KERN_SUCCESS;
+}
+
+}  // namespace google_breakpad
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_client.h
@@ -0,0 +1,65 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
+#define GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
+
+#include "common/mac/MachIPC.h"
+
+namespace google_breakpad {
+
+class CrashGenerationClient {
+ public:
+  explicit CrashGenerationClient(const char* mach_port_name)
+    : sender_(mach_port_name) {
+  }
+
+  // Request the crash server to generate a dump.
+  //
+  // Return true if the dump was successful; false otherwise.
+  bool RequestDumpForException(int exception_type,
+			       int exception_code,
+			       int exception_subcode,
+			       mach_port_t crashing_thread);
+
+  bool RequestDump() {
+    return RequestDumpForException(0, 0, 0, MACH_PORT_NULL);
+  }
+
+ private:
+  MachPortSender sender_;
+
+  // Prevent copy construction and assignment.
+  CrashGenerationClient(const CrashGenerationClient&);
+  CrashGenerationClient& operator=(const CrashGenerationClient&);
+};
+
+}  // namespace google_breakpad
+
+#endif  // GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_server.cc
@@ -0,0 +1,160 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "client/mac/crash_generation/crash_generation_server.h"
+
+#include "client/mac/crash_generation/client_info.h"
+#include "client/mac/handler/minidump_generator.h"
+#include "common/mac/scoped_task_suspend-inl.h"
+
+namespace google_breakpad {
+
+CrashGenerationServer::CrashGenerationServer(
+    const char *mach_port_name,
+    OnClientDumpRequestCallback dump_callback,
+    void *dump_context,
+    OnClientExitingCallback exit_callback,
+    void *exit_context,
+    bool generate_dumps,
+    const std::string &dump_path)
+    : dump_callback_(dump_callback),
+      dump_context_(dump_context),
+      exit_callback_(exit_callback),
+      exit_context_(exit_context),
+      generate_dumps_(generate_dumps),
+      dump_dir_(dump_path.empty() ? "/tmp" : dump_path),
+      started_(false),
+      receive_port_(mach_port_name),
+      mach_port_name_(mach_port_name) {
+}
+
+CrashGenerationServer::~CrashGenerationServer() {
+  if (started_)
+    Stop();
+}
+
+bool CrashGenerationServer::Start() {
+  int thread_create_result = pthread_create(&server_thread_, NULL,
+                                            &WaitForMessages, this);
+  started_ = thread_create_result == 0;
+  return started_;
+}
+
+bool CrashGenerationServer::Stop() {
+  if (!started_)
+    return false;
+
+  // Send a quit message to the background thread, and then join it.
+  MachPortSender sender(mach_port_name_.c_str());
+  MachSendMessage quit_message(kQuitMessage);
+  const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000;
+  kern_return_t result = sender.SendMessage(quit_message, kSendTimeoutMs);
+  if (result == KERN_SUCCESS) {
+    int thread_join_result = pthread_join(server_thread_, NULL);
+    started_ = thread_join_result != 0;
+  }
+
+  return !started_;
+}
+
+// static
+void *CrashGenerationServer::WaitForMessages(void *server) {
+  CrashGenerationServer *self =
+      reinterpret_cast<CrashGenerationServer*>(server);
+  while (self->WaitForOneMessage()) {}
+  return NULL;
+}
+
+bool CrashGenerationServer::WaitForOneMessage() {
+  MachReceiveMessage message;
+  kern_return_t result = receive_port_.WaitForMessage(&message,
+                                                      MACH_MSG_TIMEOUT_NONE);
+  if (result == KERN_SUCCESS) {
+    switch (message.GetMessageID()) {
+      case kDumpRequestMessage: {
+        ExceptionInfo &info = (ExceptionInfo &)*message.GetData();
+      
+        mach_port_t remote_task = message.GetTranslatedPort(0);
+        mach_port_t crashing_thread = message.GetTranslatedPort(1);
+        mach_port_t handler_thread = message.GetTranslatedPort(2);
+        mach_port_t ack_port = message.GetTranslatedPort(3);
+        pid_t remote_pid = -1;
+        pid_for_task(remote_task, &remote_pid);
+        ClientInfo client(remote_pid);
+
+        bool result;
+        std::string dump_path;
+        if (generate_dumps_) {
+          ScopedTaskSuspend suspend(remote_task);
+
+          MinidumpGenerator generator(remote_task, handler_thread);
+          dump_path = generator.UniqueNameInDirectory(dump_dir_, NULL);
+        
+          if (info.exception_type && info.exception_code) {
+            generator.SetExceptionInformation(info.exception_type,
+                                              info.exception_code,
+                                              info.exception_subcode,
+                                              crashing_thread);
+          }
+          result = generator.Write(dump_path.c_str());
+        } else {
+          result = true;
+        }
+
+        if (result && dump_callback_) {
+          dump_callback_(dump_context_, client, dump_path);
+        }
+
+        // TODO(ted): support a way for the client to send additional data,
+        // perhaps with a callback so users of the server can read the data
+        // themselves?
+      
+        if (ack_port != MACH_PORT_DEAD && ack_port != MACH_PORT_NULL) {
+          MachPortSender sender(ack_port);
+          MachSendMessage ack_message(kAcknowledgementMessage);
+          const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000;
+
+          sender.SendMessage(ack_message, kSendTimeoutMs);
+        }
+
+        if (exit_callback_) {
+          exit_callback_(exit_context_, client);
+        }
+        break;
+      }
+      case kQuitMessage:
+        return false;
+    }
+  } else {  // result != KERN_SUCCESS
+    return false;
+  }
+  return true;
+}
+
+}  // namespace google_breakpad
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/crash_generation_server.h
@@ -0,0 +1,139 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_
+#define GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_
+
+#include <string>
+
+#include "common/mac/MachIPC.h"
+
+namespace google_breakpad {
+
+class ClientInfo;
+
+// Messages the server can read via its mach port
+enum {
+  kDumpRequestMessage     = 1,
+  kAcknowledgementMessage = 2,
+  kQuitMessage            = 3
+};
+
+// Exception details sent by the client when requesting a dump.
+struct ExceptionInfo {
+  int exception_type;
+  int exception_code;
+  int exception_subcode;
+};
+
+class CrashGenerationServer {
+ public:
+  // WARNING: callbacks may be invoked on a different thread
+  // than that which creates the CrashGenerationServer.  They must
+  // be thread safe.
+  typedef void (*OnClientDumpRequestCallback)(void *context,
+                                              const ClientInfo &client_info,
+                                              const std::string &file_path);
+
+  typedef void (*OnClientExitingCallback)(void *context,
+                                          const ClientInfo &client_info);
+
+  // Create an instance with the given parameters.
+  //
+  // mach_port_name: Named server port to listen on.
+  // dump_callback: Callback for a client crash dump request.
+  // dump_context: Context for client crash dump request callback.
+  // exit_callback: Callback for client process exit.
+  // exit_context: Context for client exit callback.
+  // generate_dumps: Whether to automatically generate dumps.
+  //     Client code of this class might want to generate dumps explicitly
+  //     in the crash dump request callback. In that case, false can be
+  //     passed for this parameter.
+  // dump_path: Path for generating dumps; required only if true is
+  //     passed for generateDumps parameter; NULL can be passed otherwise.
+  CrashGenerationServer(const char *mach_port_name,
+                        OnClientDumpRequestCallback dump_callback,
+                        void *dump_context,
+                        OnClientExitingCallback exit_callback,
+                        void *exit_context,
+                        bool generate_dumps,
+                        const std::string &dump_path);
+
+  ~CrashGenerationServer();
+
+  // Perform initialization steps needed to start listening to clients.
+  //
+  // Return true if initialization is successful; false otherwise.
+  bool Start();
+
+  // Stop the server.
+  bool Stop();
+
+ private:
+  // Return a unique filename at which a minidump can be written.
+  bool MakeMinidumpFilename(std::string &outFilename);
+
+  // Loop reading client messages and responding to them until
+  // a quit message is received.
+  static void *WaitForMessages(void *server);
+
+  // Wait for a single client message and respond to it. Returns false
+  // if a quit message was received or if an error occurred.
+  bool WaitForOneMessage();
+
+  OnClientDumpRequestCallback dump_callback_;
+  void *dump_context_;
+
+  OnClientExitingCallback exit_callback_;
+  void *exit_context_;
+
+  bool generate_dumps_;
+
+  std::string dump_dir_;
+
+  bool started_;
+
+  // The mach port that receives requests to dump from child processes.
+  ReceivePort receive_port_;
+
+  // The name of the mach port. Stored so the Stop method can message
+  // the background thread to shut it down.
+  std::string mach_port_name_;
+
+  // The thread that waits on the receive port.
+  pthread_t server_thread_;
+
+  // Disable copy constructor and operator=.
+  CrashGenerationServer(const CrashGenerationServer&);
+  CrashGenerationServer& operator=(const CrashGenerationServer&);
+};
+
+}  // namespace google_breakpad
+
+#endif  // GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/breakpad_nlist_64.cc
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/breakpad_nlist_64.cc
@@ -132,17 +132,17 @@ breakpad_nlist_64(const char *name,
 /* Note: __fdnlist() is called from kvm_nlist in libkvm's kvm.c */
 
 int
 __breakpad_fdnlist_64(int fd, breakpad_nlist *list, const char **symbolNames) {
   register breakpad_nlist *p, *q;
   breakpad_nlist space[BUFSIZ/sizeof (breakpad_nlist)];
 
   const register char *s1, *s2;
-  register int n, m;
+  register register_t n, m;
   int maxlen, nreq;
   off_t sa;             /* symbol address */
   off_t ss;             /* start of strings */
   struct exec buf;
   unsigned  arch_offset = 0;
 
   maxlen = 500;
   for (q = list, nreq = 0;
@@ -155,24 +155,24 @@ int
     q->n_sect = 0;
     q->n_un.n_strx = 0;
   }
 
   if (read(fd, (char *)&buf, sizeof(buf)) != sizeof(buf) ||
       (N_BADMAG(buf) && *((long *)&buf) != MH_MAGIC &&
        NXSwapBigLongToHost(*((long *)&buf)) != FAT_MAGIC) &&
       /* nealsid: The following is the big-endian ppc64 check */
-      (*((uint32_t*)&buf)) != FAT_MAGIC) {
+      (*((long*)&buf)) != FAT_MAGIC) {
     return (-1);
   }
 
   /* Deal with fat file if necessary */
   if (NXSwapBigLongToHost(*((long *)&buf)) == FAT_MAGIC ||
       /* nealsid: The following is the big-endian ppc64 check */
-      *((int*)&buf) == FAT_MAGIC) {
+      *((unsigned int *)&buf) == FAT_MAGIC) {
     struct host_basic_info hbi;
     struct fat_header fh;
     struct fat_arch *fat_archs, *fap;
     unsigned i;
     host_t host;
 
     /* Get our host info */
     host = mach_host_self();
@@ -186,46 +186,46 @@ int
 
     /* Read in the fat header */
     lseek(fd, 0, SEEK_SET);
     if (read(fd, (char *)&fh, sizeof(fh)) != sizeof(fh)) {
       return (-1);
     }
 
     /* Convert fat_narchs to host byte order */
-    fh.nfat_arch = NXSwapBigLongToHost(fh.nfat_arch);
+    fh.nfat_arch = NXSwapBigIntToHost(fh.nfat_arch);
 
     /* Read in the fat archs */
     fat_archs = (struct fat_arch *)malloc(fh.nfat_arch *
                                           sizeof(struct fat_arch));
     if (fat_archs == NULL) {
       return (-1);
     }
     if (read(fd, (char *)fat_archs,
              sizeof(struct fat_arch) * fh.nfat_arch) !=
-        sizeof(struct fat_arch) * fh.nfat_arch) {
+        (ssize_t)sizeof(struct fat_arch) * fh.nfat_arch) {
       free(fat_archs);
       return (-1);
     }
 
     /*
      * Convert archs to host byte ordering (a constraint of
      * cpusubtype_getbestarch()
      */
     for (i = 0; i < fh.nfat_arch; i++) {
       fat_archs[i].cputype =
-        NXSwapBigLongToHost(fat_archs[i].cputype);
+        NXSwapBigIntToHost(fat_archs[i].cputype);
       fat_archs[i].cpusubtype =
-        NXSwapBigLongToHost(fat_archs[i].cpusubtype);
+        NXSwapBigIntToHost(fat_archs[i].cpusubtype);
       fat_archs[i].offset =
-        NXSwapBigLongToHost(fat_archs[i].offset);
+        NXSwapBigIntToHost(fat_archs[i].offset);
       fat_archs[i].size =
-        NXSwapBigLongToHost(fat_archs[i].size);
+        NXSwapBigIntToHost(fat_archs[i].size);
       fat_archs[i].align =
-        NXSwapBigLongToHost(fat_archs[i].align);
+        NXSwapBigIntToHost(fat_archs[i].align);
     }
 
     fap = NULL;
     for (i = 0; i < fh.nfat_arch; i++) {
       /* nealsid: Although the original Apple code uses host_info */
       /* to retrieve the CPU type, the host_info will still return */
       /* CPU_TYPE_X86 even if running as an x86_64 binary. Given that */
       /* this code isn't necessary on i386, I've decided to hardcode */
@@ -252,17 +252,17 @@ int
 
       /* Read in the beginning of the architecture-specific file */
       lseek(fd, arch_offset, SEEK_SET);
       if (read(fd, (char *)&buf, sizeof(buf)) != sizeof(buf)) {
         return (-1);
       }
     }
 
-    if (*((int *)&buf) == MH_MAGIC_64) {
+    if (*((unsigned int *)&buf) == MH_MAGIC_64) {
       struct mach_header_64 mh;
       struct load_command *load_commands, *lcp;
       struct symtab_command *stp;
       long i;
 
       lseek(fd, arch_offset, SEEK_SET);
       if (read(fd, (char *)&mh, sizeof(mh)) != sizeof(mh)) {
         return (-1);
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/dynamic_images.cc
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/dynamic_images.cc
@@ -29,16 +29,17 @@
 
 extern "C" { // needed to compile on Leopard
   #include <mach-o/nlist.h>
   #include <stdlib.h>
   #include <stdio.h>
 }
 
 #include "breakpad_nlist_64.h"
+#include <assert.h>
 #include <dlfcn.h>
 #include <mach/mach_vm.h>
 #include <algorithm>
 #include "client/mac/handler/dynamic_images.h"
 
 namespace google_breakpad {
 
 //==============================================================================
@@ -124,17 +125,17 @@ static void* ReadTaskString(task_port_t 
   mach_vm_size_t size_to_end;
   GetMemoryRegionSize(target_task, address, &size_to_end);
 
   if (size_to_end > 0) {
     mach_vm_size_t size_to_read =
       size_to_end > kMaxStringLength ? kMaxStringLength : size_to_end;
 
     kern_return_t kr;
-    return ReadTaskMemory(target_task, address, size_to_read, &kr);
+    return ReadTaskMemory(target_task, address, (size_t)size_to_read, &kr);
   }
 
   return NULL;
 }
 
 //==============================================================================
 // Reads an address range from another task.  A block of memory is malloced
 // and should be freed by the caller.
@@ -271,56 +272,55 @@ void DynamicImage::Print() {
   printf("slide\t\t: %td\n", GetVMAddrSlide());
 }
 
 #pragma mark -
 
 //==============================================================================
 // Loads information about dynamically loaded code in the given task.
 DynamicImages::DynamicImages(mach_port_t task)
-  : task_(task) {
+  : task_(task), image_list_() {
   ReadImageInfoForTask();
 }
 
-void* DynamicImages::GetDyldAllImageInfosPointer()
-{
-
+void* DynamicImages::GetDyldAllImageInfosPointer() {
   const char *imageSymbolName = "_dyld_all_image_infos";
   const char *dyldPath = "/usr/lib/dyld";
 #ifndef __LP64__
   struct nlist l[8];
   memset(l, 0, sizeof(l) );
 
   // First we lookup the address of the "_dyld_all_image_infos" struct
   // which lives in "dyld".  This structure contains information about all
   // of the loaded dynamic images.
   struct nlist &list = l[0];
   list.n_un.n_name = const_cast<char *>(imageSymbolName);
   nlist(dyldPath,&list);
   if(list.n_value) {
     return reinterpret_cast<void*>(list.n_value);
   }
+
+  return NULL;
 #else
   struct nlist_64 l[8];
   struct nlist_64 &list = l[0];
 
   memset(l, 0, sizeof(l) );
 
   const char *symbolNames[2] = { imageSymbolName, "\0" };
 
   int invalidEntriesCount = breakpad_nlist_64(dyldPath,&list,symbolNames);
 
   if(invalidEntriesCount != 0) {
     return NULL;
   }
-  if (list.n_value) {
-    return reinterpret_cast<void*>(list.n_value);
-  }
+  assert(list.n_value);
+  return reinterpret_cast<void*>(list.n_value);
 #endif
-  return NULL;
+
 }
 //==============================================================================
 // This code was written using dyld_debug.c (from Darwin) as a guide.
 void DynamicImages::ReadImageInfoForTask() {
   void *imageList = GetDyldAllImageInfosPointer();
 
   if (imageList) {
     kern_return_t kr;
@@ -358,17 +358,17 @@ void DynamicImages::ReadImageInfoForTask
                           sizeof(breakpad_mach_header), &kr));
 
         if (!header)
           break;   // bail on this dynamic image
 
         // Now determine the total amount we really want to read based on the
         // size of the load commands.  We need the header plus all of the
         // load commands.
-        unsigned int header_size =
+        size_t header_size =
             sizeof(breakpad_mach_header) + header->sizeofcmds;
 
         free(header);
 
         header = reinterpret_cast<breakpad_mach_header*>
           (ReadTaskMemory(task_, info.load_address_, header_size, &kr));
 
         // Read the file name from the task's memory space.
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/dynamic_images.h
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/dynamic_images.h
@@ -98,24 +98,29 @@ class MachHeader {
   breakpad_mach_header   header_;
 };
 
 //==============================================================================
 // Represents a single dynamically loaded mach-o image
 class DynamicImage {
  public:
   DynamicImage(breakpad_mach_header *header, // we take ownership
-               int header_size,              // includes load commands
+               size_t header_size,              // includes load commands
                breakpad_mach_header *load_address,
                char *inFilePath,
                uintptr_t image_mod_date,
                mach_port_t task)
     : header_(header),
       header_size_(header_size),
       load_address_(load_address),
+      vmaddr_(0),
+      vmsize_(0),
+      slide_(0),
+      version_(0),
+      file_path_(NULL),
       file_mod_date_(image_mod_date),
       task_(task) {
     InitializeFilePath(inFilePath);
     CalculateMemoryAndVersionInfo();
   }
 
   ~DynamicImage() {
     if (file_path_) {
@@ -123,17 +128,17 @@ class DynamicImage {
     }
     free(header_);
   }
 
   // Returns pointer to a local copy of the mach_header plus load commands
   breakpad_mach_header *GetMachHeader() {return header_;}
 
   // Size of mach_header plus load commands
-  int GetHeaderSize() const {return header_size_;}
+  size_t GetHeaderSize() const {return header_size_;}
 
   // Full path to mach-o binary
   char *GetFilePath() {return file_path_;}
 
   uintptr_t GetModDate() const {return file_mod_date_;}
 
   // Actual address where the image was loaded
   breakpad_mach_header *GetLoadAddress() const {return load_address_;}
@@ -153,18 +158,21 @@ class DynamicImage {
   uint32_t GetVersion() {return version_;}
   // For sorting
   bool operator<(const DynamicImage &inInfo) {
     return GetLoadAddress() < inInfo.GetLoadAddress();
   }
 
   // Debugging
   void Print();
- 
+
  private:
+  DynamicImage(const DynamicImage &);
+  DynamicImage &operator=(const DynamicImage &);
+
   friend class DynamicImages;
 
   // Sanity checking
   bool IsValid() {return GetVMSize() != 0;}
 
   // Makes local copy of file path to mach-o binary
   void InitializeFilePath(char *inFilePath) {
     if (inFilePath) {
@@ -175,17 +183,17 @@ class DynamicImage {
       file_path_ = NULL;
     }
   }
 
   // Initializes vmaddr_, vmsize_, and slide_
   void CalculateMemoryAndVersionInfo();
 
   breakpad_mach_header    *header_;        // our local copy of the header
-  int                     header_size_;    // mach_header plus load commands
+  size_t                  header_size_;    // mach_header plus load commands
   breakpad_mach_header    *load_address_;  // base address image is mapped into
   mach_vm_address_t       vmaddr_;
   mach_vm_size_t          vmsize_;
   ptrdiff_t               slide_;
   uint32_t                version_;        // Dylib version
   char                    *file_path_;     // path dyld used to load the image
   uintptr_t               file_mod_date_;  // time_t of image file
 
@@ -226,23 +234,23 @@ class DynamicImageRef {
 // An object of type DynamicImages may be created to allow introspection of
 // an arbitrary task's dynamically loaded mach-o binaries.  This makes the
 // assumption that the current task has send rights to the target task.
 class DynamicImages {
  public:
   explicit DynamicImages(mach_port_t task);
 
   ~DynamicImages() {
-    for (int i = 0; i < (int)image_list_.size(); ++i) {
+    for (int i = 0; i < GetImageCount(); ++i) {
       delete image_list_[i];
     }
   }
 
   // Returns the number of dynamically loaded mach-o images.
-  int GetImageCount() const {return image_list_.size();}
+  int GetImageCount() const {return static_cast<int>(image_list_.size());}
 
   // Returns an individual image.
   DynamicImage *GetImage(int i) {
     if (i < (int)image_list_.size()) {
       return image_list_[i];
     }
     return NULL;
   }
@@ -251,24 +259,24 @@ class DynamicImages {
   DynamicImage *GetExecutableImage();
   int GetExecutableImageIndex();
 
   // Returns the task which we're looking at.
   mach_port_t GetTask() const {return task_;}
 
   // Debugging
   void Print() {
-    for (int i = 0; i < (int)image_list_.size(); ++i) {
+    for (int i = 0; i < GetImageCount(); ++i) {
       image_list_[i]->Print();
     }
   }
 
   void TestPrint() {
     const breakpad_mach_header *header;
-    for (int i = 0; i < (int)image_list_.size(); ++i) {
+    for (int i = 0; i < GetImageCount(); ++i) {
       printf("dyld: %p: name = %s\n", _dyld_get_image_header(i),
              _dyld_get_image_name(i) );
 
       const void *imageHeader = _dyld_get_image_header(i);
       header = reinterpret_cast<const breakpad_mach_header*>(imageHeader);
 
       MachHeader(*header).Print();
     }
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.cc
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.cc
@@ -28,16 +28,17 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include <map>
 #include <pthread.h>
 
 #include "client/mac/handler/exception_handler.h"
 #include "client/mac/handler/minidump_generator.h"
 #include "common/mac/macho_utilities.h"
+#include "common/mac/scoped_task_suspend-inl.h"
 
 #ifndef USE_PROTECTED_ALLOCATIONS
 #define USE_PROTECTED_ALLOCATIONS 0
 #endif
 
 // If USE_PROTECTED_ALLOCATIONS is activated then the
 // gBreakpadAllocator needs to be setup in other code
 // ahead of time.  Please see ProtectedMemoryAllocator.h
@@ -216,32 +217,35 @@ kern_return_t breakpad_exception_raise(m
   return ForwardException(task, failed_thread, exception, code, code_count);
 }
 
 
 ExceptionHandler::ExceptionHandler(const string &dump_path,
                                    FilterCallback filter,
                                    MinidumpCallback callback,
                                    void *callback_context,
-                                   bool install_handler)
+                                   bool install_handler,
+				   const char *port_name)
     : dump_path_(),
       filter_(filter),
       callback_(callback),
       callback_context_(callback_context),
       directCallback_(NULL),
       handler_thread_(NULL),
       handler_port_(MACH_PORT_NULL),
       previous_(NULL),
       installed_exception_handler_(false),
       is_in_teardown_(false),
       last_minidump_write_result_(false),
       use_minidump_write_mutex_(false) {
   // This will update to the ID and C-string pointers
   set_dump_path(dump_path);
   MinidumpGenerator::GatherSystemInformation();
+  if (port_name)
+    crash_generation_client_.reset(new CrashGenerationClient(port_name));
   Setup(install_handler);
 }
 
 // special constructor if we want to bypass minidump writing and
 // simply get a callback with the exception information
 ExceptionHandler::ExceptionHandler(DirectCallback callback,
                                    void *callback_context,
                                    bool install_handler)
@@ -288,45 +292,89 @@ bool ExceptionHandler::WriteMinidump() {
   UpdateNextID();
   return last_minidump_write_result_;
 }
 
 // static
 bool ExceptionHandler::WriteMinidump(const string &dump_path,
                                      MinidumpCallback callback,
                                      void *callback_context) {
-  ExceptionHandler handler(dump_path, NULL, callback, callback_context, false);
+  ExceptionHandler handler(dump_path, NULL, callback, callback_context, false,
+			   NULL);
   return handler.WriteMinidump();
 }
 
+// static
+bool ExceptionHandler::WriteMinidumpForChild(mach_port_t child,
+					     mach_port_t child_blamed_thread,
+					     const string &dump_path,
+					     MinidumpCallback callback,
+					     void *callback_context) {
+  ScopedTaskSuspend suspend(child);
+
+  MinidumpGenerator generator(child, MACH_PORT_NULL);
+  string dump_id;
+  string dump_filename = generator.UniqueNameInDirectory(dump_path, &dump_id);
+
+  generator.SetExceptionInformation(EXC_BREAKPOINT,
+#if defined (__i386__) || defined(__x86_64__)
+				    EXC_I386_BPT,
+#elif defined (__ppc__) || defined (__ppc64__)
+				    EXC_PPC_BREAKPOINT,
+#else
+  #error architecture not supported
+#endif
+				    0,
+				    child_blamed_thread);
+  bool result = generator.Write(dump_filename.c_str());
+
+  if (callback) {
+    return callback(dump_path.c_str(), dump_id.c_str(),
+		    callback_context, result);
+  }
+  return result;
+}
+
 bool ExceptionHandler::WriteMinidumpWithException(int exception_type,
                                                   int exception_code,
                                                   int exception_subcode,
                                                   mach_port_t thread_name) {
   bool result = false;
 
   if (directCallback_) {
     if (directCallback_(callback_context_,
                         exception_type,
                         exception_code,
                         exception_subcode,
                         thread_name) ) {
       if (exception_type && exception_code)
         _exit(exception_type);
     }
+  } else if (IsOutOfProcess()) {
+    if (exception_type && exception_code) {
+      // If this is a real exception, give the filter (if any) a chance to
+      // decide if this should be sent.
+      if (filter_ && !filter_(callback_context_))
+	return false;
+      return crash_generation_client_->RequestDumpForException(
+	         exception_type,
+		 exception_code,
+		 exception_subcode,
+		 thread_name);
+    }
   } else {
     string minidump_id;
 
     // Putting the MinidumpGenerator in its own context will ensure that the
     // destructor is executed, closing the newly created minidump file.
     if (!dump_path_.empty()) {
       MinidumpGenerator md;
       if (exception_type && exception_code) {
         // If this is a real exception, give the filter (if any) a chance to
-        // decided if this should be sent
+        // decide if this should be sent.
         if (filter_ && !filter_(callback_context_))
           return false;
 
         md.SetExceptionInformation(exception_type, exception_code,
                                    exception_subcode, thread_name);
       }
 
       result = md.Write(next_minidump_path_c_);
@@ -448,20 +496,21 @@ kern_return_t catch_exception_raise(mach
 void *ExceptionHandler::WaitForMessage(void *exception_handler_class) {
   ExceptionHandler *self =
     reinterpret_cast<ExceptionHandler *>(exception_handler_class);
   ExceptionMessage receive;
 
   // Wait for the exception info
   while (1) {
     receive.header.msgh_local_port = self->handler_port_;
-    receive.header.msgh_size = sizeof(receive);
+    receive.header.msgh_size = static_cast<mach_msg_size_t>(sizeof(receive));
     kern_return_t result = mach_msg(&(receive.header),
                                     MACH_RCV_MSG | MACH_RCV_LARGE, 0,
-                                    sizeof(receive), self->handler_port_,
+                                    receive.header.msgh_size,
+                                    self->handler_port_,
                                     MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
 
 
     if (result == KERN_SUCCESS) {
       // Uninstall our handler so that we don't get in a loop if the process of
       // writing out a minidump causes an exception.  However, if the exception
       // was caused by a fork'd process, don't uninstall things
 
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.h
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.h
@@ -35,16 +35,19 @@
 
 #ifndef CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__
 #define CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__
 
 #include <mach/mach.h>
 
 #include <string>
 
+#include "client/mac/crash_generation/crash_generation_client.h"
+#include "processor/scoped_ptr.h"
+
 namespace google_breakpad {
 
 using std::string;
 
 struct ExceptionParameters;
 
 class ExceptionHandler {
  public:
@@ -81,19 +84,22 @@ class ExceptionHandler {
                                   mach_port_t thread_name);
 
   // Creates a new ExceptionHandler instance to handle writing minidumps.
   // Minidump files will be written to dump_path, and the optional callback
   // is called after writing the dump file, as described above.
   // If install_handler is true, then a minidump will be written whenever
   // an unhandled exception occurs.  If it is false, minidumps will only
   // be written when WriteMinidump is called.
+  // If port_name is non-NULL, attempt to perform out-of-process dump generation
+  // If port_name is NULL, in-process dump generation will be used.
   ExceptionHandler(const string &dump_path,
                    FilterCallback filter, MinidumpCallback callback,
-                   void *callback_context, bool install_handler);
+                   void *callback_context, bool install_handler,
+		   const char *port_name);
 
   // A special constructor if we want to bypass minidump writing and
   // simply get a callback with the exception information.
   ExceptionHandler(DirectCallback callback,
                    void *callback_context,
                    bool install_handler);
 
   ~ExceptionHandler();
@@ -110,16 +116,29 @@ class ExceptionHandler {
   // execution state independently of a crash.  Returns true on success.
   bool WriteMinidump();
 
   // Convenience form of WriteMinidump which does not require an
   // ExceptionHandler instance.
   static bool WriteMinidump(const string &dump_path, MinidumpCallback callback,
                             void *callback_context);
 
+  // Write a minidump of child immediately. This can be used to capture
+  // the execution state of a child process independently of a crash.
+  static bool WriteMinidumpForChild(mach_port_t child,
+				    mach_port_t child_blamed_thread,
+				    const std::string &dump_path,
+				    MinidumpCallback callback,
+				    void *callback_context);
+
+  // Returns whether out-of-process dump generation is used or not.
+  bool IsOutOfProcess() const {
+    return crash_generation_client_.get() != NULL;
+  }
+
  private:
   // Install the mach exception handler
   bool InstallHandler();
 
   // Uninstall the mach exception handler (if any)
   bool UninstallHandler(bool in_exception);
 
   // Setup the handler thread, and if |install_handler| is true, install the
@@ -201,13 +220,16 @@ class ExceptionHandler {
   bool last_minidump_write_result_;
 
   // A mutex for use when writing out a minidump that was requested on a
   // thread other than the exception handler.
   pthread_mutex_t minidump_write_mutex_;
 
   // True, if we're using the mutext to indicate when mindump writing occurs
   bool use_minidump_write_mutex_;
+
+  // Client for out-of-process dump generation.
+  scoped_ptr<CrashGenerationClient> crash_generation_client_;
 };
 
 }  // namespace google_breakpad
 
 #endif  // CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__
deleted file mode 100644
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler_test.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (c) 2006, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-/*
-g++ -framework CoreFoundation -I../../.. ../../minidump_file_writer.cc ../../../common/convert_UTF.c ../../../common/string_conversion.cc ../../../common/mac/string_utilities.cc exception_handler.cc minidump_generator.cc exception_handler_test.cc -o exception_handler_test -mmacosx-version-min=10.4 ../../../common/mac/file_id.cc  dynamic_images.cc ../../../common/mac/macho_id.cc  ../../../common/mac/macho_walker.cc  -lcrypto ../../../common/mac/macho_utilities.cc 
-*/
-
-#include <pthread.h>
-#include <pwd.h>
-#include <unistd.h>
-
-#include <CoreFoundation/CoreFoundation.h>
-
-#include "exception_handler.h"
-#include "minidump_generator.h"
-
-using std::string;
-using google_breakpad::ExceptionHandler;
-
-static void *SleepyFunction(void *) {
-  while (1) {
-    sleep(10000);
-  }
-  return NULL;
-}
-
-static void Crasher() {
-  int *a = (int*)0x42;
-
-	fprintf(stdout, "Going to crash...\n");
-  fprintf(stdout, "A = %d", *a);
-}
-
-static void SoonToCrash() {
-  Crasher();
-}
-
-bool MDCallback(const char *dump_dir, const char *file_name,
-                void *context, bool success) {
-  string path(dump_dir);
-  string dest(dump_dir);
-  path.append(file_name);
-  path.append(".dmp");
-
-  fprintf(stdout, "Minidump: %s\n", path.c_str());
-  // Indicate that we've handled the callback
-  exit(0);
-}
-
-int main(int argc, char * const argv[]) {
-  char buffer[PATH_MAX];
-
-  // Home dir
-  snprintf(buffer, sizeof(buffer), "/tmp/");
-
-  string path(buffer);
-  ExceptionHandler eh(path, NULL, MDCallback, NULL, true);
-  pthread_t t;
-
-  if (pthread_create(&t, NULL, SleepyFunction, NULL) == 0) {
-    pthread_detach(t);
-  } else {
-    perror("pthread_create");
-  }
-
-//   // Dump a test
-//   eh.WriteMinidump();
-
-	// Test the handler
-  SoonToCrash();
-
-  return 0;
-}
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.cc
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.cc
@@ -52,36 +52,39 @@ namespace google_breakpad {
 #if __LP64__
 #define LC_SEGMENT_ARCH LC_SEGMENT_64
 #else
 #define LC_SEGMENT_ARCH LC_SEGMENT
 #endif
 
 // constructor when generating from within the crashed process
 MinidumpGenerator::MinidumpGenerator()
-    : exception_type_(0),
+    : writer_(),
+      exception_type_(0),
       exception_code_(0),
       exception_subcode_(0),
       exception_thread_(0),
       crashing_task_(mach_task_self()),
       handler_thread_(mach_thread_self()),
       dynamic_images_(NULL) {
   GatherSystemInformation();
 }
 
 // constructor when generating from a different process than the
 // crashed process
 MinidumpGenerator::MinidumpGenerator(mach_port_t crashing_task,
                                      mach_port_t handler_thread)
-    : exception_type_(0),
+    : writer_(),
+      exception_type_(0),
       exception_code_(0),
       exception_subcode_(0),
       exception_thread_(0),
       crashing_task_(crashing_task),
-      handler_thread_(handler_thread) {
+      handler_thread_(handler_thread),
+      dynamic_images_(NULL) {
   if (crashing_task != mach_task_self()) {
     dynamic_images_ = new DynamicImages(crashing_task_);
   } else {
     dynamic_images_ = NULL;
   }
 
   GatherSystemInformation();
 }
@@ -186,17 +189,17 @@ bool MinidumpGenerator::Write(const char
   // flushed.  The destructor for the MinidumpFileWriter will close the file.
   if (writer_.Open(path)) {
     TypedMDRVA<MDRawHeader> header(&writer_);
     TypedMDRVA<MDRawDirectory> dir(&writer_);
 
     if (!header.Allocate())
       return false;
 
-    int writer_count = sizeof(writers) / sizeof(writers[0]);
+    int writer_count = static_cast<int>(sizeof(writers) / sizeof(writers[0]));
 
     // If we don't have exception information, don't write out the
     // exception stream
     if (!exception_thread_ && !exception_type_)
       --writer_count;
 
     // Add space for all writers
     if (!dir.AllocateArray(writer_count))
@@ -350,17 +353,17 @@ bool MinidumpGenerator::WriteContext(bre
     return false;
 
   *register_location = context.location();
   MinidumpContext *context_ptr = context.get();
   context_ptr->context_flags = MD_CONTEXT_PPC_BASE;
 
 #define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)
 #define AddGPR(a) context_ptr->gpr[a] = REGISTER_FROM_THREADSTATE(machine_state, r ## a)
- 
+
   AddReg(srr0);
   AddReg(cr);
   AddReg(xer);
   AddReg(ctr);
   AddReg(lr);
   AddReg(vrsave);
 
   AddGPR(0);
@@ -483,31 +486,32 @@ bool MinidumpGenerator::WriteContext(bre
   AddReg(r13);
   AddReg(r14);
   AddReg(r15);
   AddReg(rip);
   // according to AMD's software developer guide, bits above 18 are
   // not used in the flags register.  Since the minidump format
   // specifies 32 bits for the flags register, we can truncate safely
   // with no loss.
-  context_ptr->eflags = machine_state->__rflags;
+  context_ptr->eflags = static_cast<u_int32_t>(machine_state->__rflags);
   AddReg(cs);
   AddReg(fs);
   AddReg(gs);
 #endif
 #undef AddReg(a)
 
   return true;
 }
 #endif
 
 bool MinidumpGenerator::WriteThreadStream(mach_port_t thread_id,
                                           MDRawThread *thread) {
   breakpad_thread_state_data_t state;
-  mach_msg_type_number_t state_count = sizeof(state);
+  mach_msg_type_number_t state_count
+      = static_cast<mach_msg_type_number_t>(sizeof(state));
 
   if (thread_get_state(thread_id, BREAKPAD_MACHINE_THREAD_STATE,
                        state, &state_count) ==
       KERN_SUCCESS) {
     if (!WriteStack(state, &thread->stack))
       return false;
 
     if (!WriteContext(state, &thread->thread_context))
@@ -527,17 +531,20 @@ bool MinidumpGenerator::WriteThreadListS
   thread_act_port_array_t threads_for_task;
   mach_msg_type_number_t thread_count;
   int non_generator_thread_count;
 
   if (task_threads(crashing_task_, &threads_for_task, &thread_count))
     return false;
 
   // Don't include the generator thread
-  non_generator_thread_count = thread_count - 1;
+  if (handler_thread_ != MACH_PORT_NULL)
+    non_generator_thread_count = thread_count - 1;
+  else
+    non_generator_thread_count = thread_count;
   if (!list.AllocateObjectAndArray(non_generator_thread_count,
                                    sizeof(MDRawThread)))
     return false;
 
   thread_list_stream->stream_type = MD_THREAD_LIST_STREAM;
   thread_list_stream->location = list.location();
 
   list.get()->number_of_threads = non_generator_thread_count;
@@ -572,17 +579,18 @@ MinidumpGenerator::WriteExceptionStream(
   exception_ptr->thread_id = exception_thread_;
 
   // This naming is confusing, but it is the proper translation from
   // mach naming to minidump naming.
   exception_ptr->exception_record.exception_code = exception_type_;
   exception_ptr->exception_record.exception_flags = exception_code_;
 
   breakpad_thread_state_data_t state;
-  mach_msg_type_number_t stateCount = sizeof(state);
+  mach_msg_type_number_t stateCount
+      = static_cast<mach_msg_type_number_t>(sizeof(state));
 
   if (thread_get_state(exception_thread_,
                        BREAKPAD_MACHINE_THREAD_STATE,
                        state,
                        &stateCount) != KERN_SUCCESS)
     return false;
 
   if (!WriteContext(state, &exception_ptr->thread_context))
@@ -722,17 +730,17 @@ bool MinidumpGenerator::WriteModuleStrea
 
     MDLocationDescriptor string_location;
 
     const char* name = image->GetFilePath();
     if (!writer_.WriteString(name, 0, &string_location))
       return false;
 
     module->base_of_image = image->GetVMAddr() + image->GetVMAddrSlide();
-    module->size_of_image = image->GetVMSize();
+    module->size_of_image = static_cast<u_int32_t>(image->GetVMSize());
     module->module_name_rva = string_location.rva;
 
     // We'll skip the executable module, because they don't have
     // LC_ID_DYLIB load commands, and the crash processing server gets
     // version information from the Plist file, anyway.
     if (index != (uint32_t)FindExecutableModule()) {
       module->version_info.signature = MD_VSFIXEDFILEINFO_SIGNATURE;
       module->version_info.struct_version |= MD_VSFIXEDFILEINFO_VERSION;
@@ -789,17 +797,17 @@ bool MinidumpGenerator::WriteModuleStrea
 
         if (!strcmp(seg->segname, "__TEXT")) {
           MDLocationDescriptor string_location;
 
           if (!writer_.WriteString(name, 0, &string_location))
             return false;
 
           module->base_of_image = seg->vmaddr + slide;
-          module->size_of_image = seg->vmsize;
+          module->size_of_image = static_cast<u_int32_t>(seg->vmsize);
           module->module_name_rva = string_location.rva;
 
           if (!WriteCVRecord(module, cpu_type, name))
             return false;
 
           return true;
         }
       }
@@ -926,55 +934,60 @@ bool MinidumpGenerator::WriteMiscInfoStr
 
   if (!info.Allocate())
     return false;
 
   misc_info_stream->stream_type = MD_MISC_INFO_STREAM;
   misc_info_stream->location = info.location();
 
   MDRawMiscInfo *info_ptr = info.get();
-  info_ptr->size_of_info = sizeof(MDRawMiscInfo);
+  info_ptr->size_of_info = static_cast<u_int32_t>(sizeof(MDRawMiscInfo));
   info_ptr->flags1 = MD_MISCINFO_FLAGS1_PROCESS_ID |
     MD_MISCINFO_FLAGS1_PROCESS_TIMES |
     MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO;
 
   // Process ID
   info_ptr->process_id = getpid();
 
   // Times
   struct rusage usage;
   if (getrusage(RUSAGE_SELF, &usage) != -1) {
     // Omit the fractional time since the MDRawMiscInfo only wants seconds
-    info_ptr->process_user_time = usage.ru_utime.tv_sec;
-    info_ptr->process_kernel_time = usage.ru_stime.tv_sec;
+    info_ptr->process_user_time =
+        static_cast<u_int32_t>(usage.ru_utime.tv_sec);
+    info_ptr->process_kernel_time =
+        static_cast<u_int32_t>(usage.ru_stime.tv_sec);
   }
   int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, info_ptr->process_id };
+  u_int mibsize = static_cast<u_int>(sizeof(mib) / sizeof(mib[0]));
   size_t size;
-  if (!sysctl(mib, sizeof(mib) / sizeof(mib[0]), NULL, &size, NULL, 0)) {
+  if (!sysctl(mib, mibsize, NULL, &size, NULL, 0)) {
     mach_vm_address_t addr;
     if (mach_vm_allocate(mach_task_self(),
                          &addr,
                          size,
                          true) == KERN_SUCCESS) {
       struct kinfo_proc *proc = (struct kinfo_proc *)addr;
-      if (!sysctl(mib, sizeof(mib) / sizeof(mib[0]), proc, &size, NULL, 0))
-        info_ptr->process_create_time = proc->kp_proc.p_starttime.tv_sec;
+      if (!sysctl(mib, mibsize, proc, &size, NULL, 0))
+        info_ptr->process_create_time =
+            static_cast<u_int32_t>(proc->kp_proc.p_starttime.tv_sec);
       mach_vm_deallocate(mach_task_self(), addr, size);
     }
   }
 
   // Speed
   uint64_t speed;
+  const uint64_t kOneMillion = 1000 * 1000;
   size = sizeof(speed);
   sysctlbyname("hw.cpufrequency_max", &speed, &size, NULL, 0);
-  info_ptr->processor_max_mhz = speed / (1000 * 1000);
-  info_ptr->processor_mhz_limit = speed / (1000 * 1000);
+  info_ptr->processor_max_mhz = static_cast<u_int32_t>(speed / kOneMillion);
+  info_ptr->processor_mhz_limit = static_cast<u_int32_t>(speed / kOneMillion);
   size = sizeof(speed);
   sysctlbyname("hw.cpufrequency", &speed, &size, NULL, 0);
-  info_ptr->processor_current_mhz = speed / (1000 * 1000);
+  info_ptr->processor_current_mhz = static_cast<u_int32_t>(speed / kOneMillion);
 
   return true;
 }
 
 bool MinidumpGenerator::WriteBreakpadInfoStream(
     MDRawDirectory *breakpad_info_stream) {
   TypedMDRVA<MDRawBreakpadInfo> info(&writer_);
 
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj
@@ -1,17 +1,31 @@
 // !$*UTF8*$!
 {
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
+		8BFC813F11FF9A58002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };
+		8BFC814411FF9A9C002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };
+		8BFC814511FF9A9D002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };
+		8BFC814811FF9B13002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };
+		8BFC814911FF9B13002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };
+		8BFC814A11FF9B13002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };
+		8BFC814B11FF9B3F002CB4DC /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */; };
+		8BFC814C11FF9B3F002CB4DC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */; };
+		8BFC81A211FF9C2E002CB4DC /* CPlusTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC819211FF9C23002CB4DC /* CPlusTest.framework */; };
+		8BFC81A311FF9C2F002CB4DC /* CPlusTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC819211FF9C23002CB4DC /* CPlusTest.framework */; };
+		8BFC81AD11FF9C8A002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; };
+		8BFC81AE11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; };
+		8BFC81AF11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; };
+		8BFC81B011FF9C8D002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; };
 		9B35FF5A0B267D5F008DE8C7 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF560B267D5F008DE8C7 /* convert_UTF.c */; };
 		9B35FF5B0B267D5F008DE8C7 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF580B267D5F008DE8C7 /* string_conversion.cc */; };
 		9B37CEEC0AF98ECD00FA4BD4 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */; };
 		9B7CA7700B12873A00CD3A1D /* minidump_file_writer-inl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BE3C01E0B0CE329009892DF /* minidump_file_writer-inl.h */; };
 		9B7CA8540B12989000CD3A1D /* minidump_file_writer_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B7CA8530B12989000CD3A1D /* minidump_file_writer_unittest.cc */; };
 		9B7CA8550B1298A100CD3A1D /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C230B01344C0055103E /* minidump_file_writer.cc */; };
 		9BC1D2940B336F2300F2A2B4 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF560B267D5F008DE8C7 /* convert_UTF.c */; };
 		9BC1D2950B336F2500F2A2B4 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF580B267D5F008DE8C7 /* string_conversion.cc */; };
@@ -89,22 +103,28 @@
 				D2F651130BEF951C00920385 /* string_conversion.h in CopyFiles */,
 				D2F651160BEF953100920385 /* convert_UTF.h in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 1;
 		};
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		8BFC812011FF99D5002CB4DC /* Breakpad.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Breakpad.xcconfig; path = ../../../common/mac/Breakpad.xcconfig; sourceTree = SOURCE_ROOT; };
+		8BFC812111FF99D5002CB4DC /* BreakpadDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadDebug.xcconfig; path = ../../../common/mac/BreakpadDebug.xcconfig; sourceTree = SOURCE_ROOT; };
+		8BFC812211FF99D5002CB4DC /* BreakpadRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadRelease.xcconfig; path = ../../../common/mac/BreakpadRelease.xcconfig; sourceTree = SOURCE_ROOT; };
+		8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcrypto.dylib; path = usr/lib/libcrypto.dylib; sourceTree = SDKROOT; };
+		8BFC815411FF9B7F002CB4DC /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+		8BFC819211FF9C23002CB4DC /* CPlusTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CPlusTest.framework; path = Library/Frameworks/CPlusTest.framework; sourceTree = DEVELOPER_DIR; };
 		8DD76F6C0486A84900D96B5E /* generator_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = generator_test; sourceTree = BUILT_PRODUCTS_DIR; };
 		9B35FF560B267D5F008DE8C7 /* convert_UTF.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = convert_UTF.c; path = ../../../common/convert_UTF.c; sourceTree = SOURCE_ROOT; };
 		9B35FF570B267D5F008DE8C7 /* convert_UTF.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = convert_UTF.h; path = ../../../common/convert_UTF.h; sourceTree = SOURCE_ROOT; };
 		9B35FF580B267D5F008DE8C7 /* string_conversion.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = string_conversion.cc; path = ../../../common/string_conversion.cc; sourceTree = SOURCE_ROOT; };
 		9B35FF590B267D5F008DE8C7 /* string_conversion.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = string_conversion.h; path = ../../../common/string_conversion.h; sourceTree = SOURCE_ROOT; };
-		9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
+		9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
 		9B7CA84E0B1297F200CD3A1D /* unit_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = unit_test; sourceTree = BUILT_PRODUCTS_DIR; };
 		9B7CA8530B12989000CD3A1D /* minidump_file_writer_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer_unittest.cc; path = ../../minidump_file_writer_unittest.cc; sourceTree = "<group>"; };
 		9BD82A9B0B00267E0055103E /* handler_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = handler_test; sourceTree = BUILT_PRODUCTS_DIR; };
 		9BD82BFD0B01333D0055103E /* exception_handler_test.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = exception_handler_test.cc; sourceTree = SOURCE_ROOT; };
 		9BD82BFE0B01333D0055103E /* minidump_generator_test.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = minidump_generator_test.cc; sourceTree = SOURCE_ROOT; };
 		9BD82C090B0133520055103E /* exception_handler.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = exception_handler.cc; sourceTree = SOURCE_ROOT; };
 		9BD82C0A0B0133520055103E /* exception_handler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = exception_handler.h; sourceTree = SOURCE_ROOT; };
 		9BD82C0B0B0133520055103E /* minidump_generator.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = minidump_generator.cc; sourceTree = SOURCE_ROOT; };
@@ -127,21 +147,21 @@
 		F917C4F70E03265A00F86017 /* breakpad_exc_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = breakpad_exc_server.c; sourceTree = "<group>"; };
 		F917C4F80E03265A00F86017 /* breakpad_exc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_exc_server.h; sourceTree = "<group>"; };
 		F93A88750E8B4C700026AF89 /* octestcases.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = octestcases.octest; sourceTree = BUILT_PRODUCTS_DIR; };
 		F93A88760E8B4C700026AF89 /* obj-cTestCases-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "obj-cTestCases-Info.plist"; sourceTree = "<group>"; };
 		F9721F300E8B07E800D7E813 /* dwarftests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dwarftests.h; sourceTree = "<group>"; };
 		F9721F310E8B07E800D7E813 /* dwarftests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = dwarftests.mm; sourceTree = "<group>"; };
 		F9721F380E8B0CFC00D7E813 /* dump_syms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dump_syms.h; path = ../../../common/mac/dump_syms.h; sourceTree = SOURCE_ROOT; };
 		F9721F390E8B0D0D00D7E813 /* dump_syms.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = dump_syms.mm; path = ../../../common/mac/dump_syms.mm; sourceTree = SOURCE_ROOT; };
-		F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+		F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
 		F9721F760E8B0DC700D7E813 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
 		F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };
 		F9721F780E8B0DC700D7E813 /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };
-		F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = /System/Library/Frameworks/SenTestingKit.framework; sourceTree = "<absolute>"; };
+		F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
 		F9721FA80E8B0E4800D7E813 /* md5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.c; path = ../../../common/md5.c; sourceTree = SOURCE_ROOT; };
 		F982089A0DB3280D0017AECA /* breakpad_nlist_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_test.h; sourceTree = "<group>"; };
 		F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_test.cc; sourceTree = "<group>"; };
 		F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_64.cc; sourceTree = "<group>"; };
 		F98208A20DB32CAE0017AECA /* breakpad_nlist_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_64.h; sourceTree = "<group>"; };
 		F9AE19B50DB040E300C98454 /* minidump_tests32-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "minidump_tests32-Info.plist"; sourceTree = "<group>"; };
 		F9AE19C30DB04A9500C98454 /* minidump_tests64.cptest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = minidump_tests64.cptest; sourceTree = BUILT_PRODUCTS_DIR; };
 		F9AE5B330DBFDBA300505983 /* minidump_tests32.cptest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = minidump_tests32.cptest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -151,63 +171,76 @@
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
 		8DD76F660486A84900D96B5E /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				9B37CEEC0AF98ECD00FA4BD4 /* CoreFoundation.framework in Frameworks */,
+				8BFC813F11FF9A58002CB4DC /* libcrypto.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		9B7CA84C0B1297F200CD3A1D /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8BFC814511FF9A9D002CB4DC /* libcrypto.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		9BD82A990B00267E0055103E /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				9BD82AC10B0029DF0055103E /* CoreFoundation.framework in Frameworks */,
+				8BFC814411FF9A9C002CB4DC /* libcrypto.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F93A88720E8B4C700026AF89 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8BFC814A11FF9B13002CB4DC /* libcrypto.dylib in Frameworks */,
+				8BFC814B11FF9B3F002CB4DC /* SenTestingKit.framework in Frameworks */,
+				8BFC814C11FF9B3F002CB4DC /* Cocoa.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F9AE19C00DB04A9500C98454 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8BFC814811FF9B13002CB4DC /* libcrypto.dylib in Frameworks */,
+				8BFC81A211FF9C2E002CB4DC /* CPlusTest.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F9AE5B300DBFDBA300505983 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F9721F6C0E8B0D7000D7E813 /* Cocoa.framework in Frameworks */,
 				F9721FA20E8B0E2300D7E813 /* SenTestingKit.framework in Frameworks */,
+				8BFC814911FF9B13002CB4DC /* libcrypto.dylib in Frameworks */,
+				8BFC81A311FF9C2F002CB4DC /* CPlusTest.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
 		08FB7794FE84155DC02AAC07 /* MinidumpWriter */ = {
 			isa = PBXGroup;
 			children = (
+				8BFC812011FF99D5002CB4DC /* Breakpad.xcconfig */,
+				8BFC812111FF99D5002CB4DC /* BreakpadDebug.xcconfig */,
+				8BFC812211FF99D5002CB4DC /* BreakpadRelease.xcconfig */,
 				F9721FA80E8B0E4800D7E813 /* md5.c */,
 				F9721F760E8B0DC700D7E813 /* bytereader.cc */,
 				F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */,
 				F9721F780E8B0DC700D7E813 /* functioninfo.cc */,
 				F9721F390E8B0D0D00D7E813 /* dump_syms.mm */,
 				F9721F380E8B0CFC00D7E813 /* dump_syms.h */,
 				F917C4F70E03265A00F86017 /* breakpad_exc_server.c */,
 				F917C4F80E03265A00F86017 /* breakpad_exc_server.h */,
@@ -256,19 +289,22 @@
 				F93A88750E8B4C700026AF89 /* octestcases.octest */,
 			);
 			name = Products;
 			sourceTree = "<group>";
 		};
 		9B37CEEA0AF98EB600FA4BD4 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */,
+				8BFC815411FF9B7F002CB4DC /* Carbon.framework */,
 				F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */,
 				F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */,
 				9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */,
+				8BFC819211FF9C23002CB4DC /* CPlusTest.framework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
 		};
 		9BD82C040B0133420055103E /* Breakpad */ = {
 			isa = PBXGroup;
 			children = (
 				9B35FF560B267D5F008DE8C7 /* convert_UTF.c */,
@@ -409,17 +445,17 @@
 			productType = "com.apple.product-type.bundle";
 		};
 /* End PBXNativeTarget section */
 
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "minidump_test" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
 			hasScannedForEncodings = 1;
 			mainGroup = 08FB7794FE84155DC02AAC07 /* MinidumpWriter */;
 			projectDirPath = "";
 			projectRoot = "";
 			targets = (
 				8DD76F620486A84900D96B5E /* generator_test */,
 				9BD82A9A0B00267E0055103E /* handler_test */,
 				9B7CA84D0B1297F200CD3A1D /* unit_test */,
@@ -508,27 +544,29 @@
 				9BD82C2E0B01345E0055103E /* string_utilities.cc in Sources */,
 				D2F651000BEF947200920385 /* file_id.cc in Sources */,
 				D2F651020BEF947200920385 /* macho_id.cc in Sources */,
 				D2F651040BEF947200920385 /* macho_utilities.cc in Sources */,
 				D2F651090BEF949A00920385 /* dynamic_images.cc in Sources */,
 				D2F6510E0BEF94EB00920385 /* macho_walker.cc in Sources */,
 				D2F651110BEF951700920385 /* string_conversion.cc in Sources */,
 				D2F651150BEF953000920385 /* convert_UTF.c in Sources */,
+				8BFC81B011FF9C8D002CB4DC /* breakpad_nlist_64.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		9B7CA84B0B1297F200CD3A1D /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				9B7CA8540B12989000CD3A1D /* minidump_file_writer_unittest.cc in Sources */,
 				9B7CA8550B1298A100CD3A1D /* minidump_file_writer.cc in Sources */,
 				9BC1D2940B336F2300F2A2B4 /* convert_UTF.c in Sources */,
 				9BC1D2950B336F2500F2A2B4 /* string_conversion.cc in Sources */,
+				8BFC81AE11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		9BD82A980B00267E0055103E /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				9BD82BFF0B01333D0055103E /* exception_handler_test.cc in Sources */,
@@ -538,16 +576,17 @@
 				9BD82C2D0B01345E0055103E /* string_utilities.cc in Sources */,
 				9B35FF5A0B267D5F008DE8C7 /* convert_UTF.c in Sources */,
 				9B35FF5B0B267D5F008DE8C7 /* string_conversion.cc in Sources */,
 				D2F6511B0BEF970E00920385 /* dynamic_images.cc in Sources */,
 				D2F6511D0BEF973500920385 /* file_id.cc in Sources */,
 				D2F6511E0BEF973600920385 /* macho_id.cc in Sources */,
 				D2F6511F0BEF973900920385 /* macho_utilities.cc in Sources */,
 				D2F651210BEF975400920385 /* macho_walker.cc in Sources */,
+				8BFC81AF11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F93A88710E8B4C700026AF89 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F93A88860E8B4C9A0026AF89 /* dwarftests.mm in Sources */,
@@ -575,324 +614,156 @@
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		F9AE5B2F0DBFDBA300505983 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				F9AE5B390DBFDBDB00505983 /* dynamic_images.cc in Sources */,
 				F9AE5B3A0DBFDBDB00505983 /* DynamicImagesTests.cc in Sources */,
+				8BFC81AD11FF9C8A002CB4DC /* breakpad_nlist_64.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXSourcesBuildPhase section */
 
 /* Begin XCBuildConfiguration section */
 		1DEB923208733DC60010E9CD /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_CW_ASM_SYNTAX = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_ENABLE_PASCAL_STRINGS = NO;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_THREADSAFE_STATICS = NO;
-				INSTALL_PATH = "$(HOME)/bin";
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(DEVELOPER_FRAMEWORKS_DIR)\"",
+				);
 				PRODUCT_NAME = generator_test;
 				USER_HEADER_SEARCH_PATHS = "../../../** $(inherited)";
-				ZERO_LINK = NO;
 			};
 			name = Debug;
 		};
 		1DEB923308733DC60010E9CD /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = (
-					ppc,
-					i386,
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"$(DEVELOPER_FRAMEWORKS_DIR)\"",
 				);
-				GCC_CW_ASM_SYNTAX = NO;
-				GCC_ENABLE_PASCAL_STRINGS = NO;
-				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_MODEL_TUNING = G5;
-				GCC_THREADSAFE_STATICS = NO;
-				INSTALL_PATH = "$(HOME)/bin";
 				PRODUCT_NAME = generator_test;
 				USER_HEADER_SEARCH_PATHS = "../../../** $(inherited)";
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		1DEB923608733DC60010E9CD /* Debug */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 8BFC812111FF99D5002CB4DC /* BreakpadDebug.xcconfig */;
 			buildSettings = {
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				OTHER_LDFLAGS = "-lcrypto";
-				PREBINDING = NO;
-				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
 			};
 			name = Debug;
 		};
 		1DEB923708733DC60010E9CD /* Release */ = {
 			isa = XCBuildConfiguration;
+			baseConfigurationReference = 8BFC812211FF99D5002CB4DC /* BreakpadRelease.xcconfig */;
 			buildSettings = {
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				OTHER_LDFLAGS = "-lcrypto";
-				PREBINDING = NO;
-				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
 			};
 			name = Release;
 		};
 		9B7CA8510B12984300CD3A1D /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				INSTALL_PATH = "$(HOME)/bin";
-				PREBINDING = NO;
 				PRODUCT_NAME = unit_test;
 				USER_HEADER_SEARCH_PATHS = "../../../** $(inherited)";
-				ZERO_LINK = NO;
 			};
 			name = Debug;
 		};
 		9B7CA8520B12984300CD3A1D /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_MODEL_TUNING = G5;
-				INSTALL_PATH = "$(HOME)/bin";
-				PREBINDING = NO;
 				PRODUCT_NAME = unit_test;
 				USER_HEADER_SEARCH_PATHS = "../../../** $(inherited)";
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		9BD82AA70B0026BF0055103E /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(NATIVE_ARCH)";
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-				INSTALL_PATH = "$(HOME)/bin";
-				OTHER_CFLAGS = "-Wall";
-				PREBINDING = NO;
 				PRODUCT_NAME = handler_test;
 				USER_HEADER_SEARCH_PATHS = "../../.. $(inherited)";
-				ZERO_LINK = NO;
 			};
 			name = Debug;
 		};
 		9BD82AA80B0026BF0055103E /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(NATIVE_ARCH)";
-				COPY_PHASE_STRIP = YES;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_MODEL_TUNING = G5;
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-				INSTALL_PATH = "$(HOME)/bin";
-				OTHER_CFLAGS = "-Wall";
-				PREBINDING = NO;
 				PRODUCT_NAME = handler_test;
 				USER_HEADER_SEARCH_PATHS = "../../.. $(inherited)";
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F93A88770E8B4C700026AF89 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = NO;
 				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_CHAR_IS_UNSIGNED_CHAR = YES;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
 				INFOPLIST_FILE = "obj-cTestCases-Info.plist";
-				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
-				OTHER_LDFLAGS = (
-					"-lcrypto",
-					"-framework",
-					Cocoa,
-					"-framework",
-					SenTestingKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = octestcases;
 				USER_HEADER_SEARCH_PATHS = "../../../..//**";
 				WRAPPER_EXTENSION = octest;
 			};
 			name = Debug;
 		};
 		F93A88780E8B4C700026AF89 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_CHAR_IS_UNSIGNED_CHAR = YES;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_MODEL_TUNING = G5;
 				INFOPLIST_FILE = "obj-cTestCases-Info.plist";
-				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
-				OTHER_LDFLAGS = (
-					"-lcrypto",
-					"-framework",
-					Cocoa,
-					"-framework",
-					SenTestingKit,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = octestcases;
 				USER_HEADER_SEARCH_PATHS = "../../../..//**";
 				WRAPPER_EXTENSION = octest;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F9AE19C40DB04A9500C98454 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = (
-					"$(NATIVE_ARCH_64_BIT)",
-					ppc64,
-				);
-				COPY_PHASE_STRIP = NO;
 				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
 				INFOPLIST_FILE = "minidump_tests64-Info.plist";
-				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
-				MACOSX_DEPLOYMENT_TARGET = 10.5;
-				OTHER_LDFLAGS = (
-					"-framework",
-					Carbon,
-					"-framework",
-					CPlusTest,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = minidump_tests64;
-				SDKROOT = /Developer/SDKs/MacOSX10.5.sdk;
 				USER_HEADER_SEARCH_PATHS = "../../../**";
 				WRAPPER_EXTENSION = cptest;
 			};
 			name = Debug;
 		};
 		F9AE19C50DB04A9500C98454 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = (
-					"$(NATIVE_ARCH_64_BIT)",
-					ppc64,
-				);
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_MODEL_TUNING = G5;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
 				INFOPLIST_FILE = "minidump_tests64-Info.plist";
-				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
-				MACOSX_DEPLOYMENT_TARGET = 10.5;
-				OTHER_LDFLAGS = (
-					"-framework",
-					Carbon,
-					"-framework",
-					CPlusTest,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = minidump_tests64;
-				SDKROOT = /Developer/SDKs/MacOSX10.5.sdk;
 				USER_HEADER_SEARCH_PATHS = "../../../**";
 				WRAPPER_EXTENSION = cptest;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 		F9AE5B350DBFDBA300505983 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(NATIVE_ARCH)";
-				COPY_PHASE_STRIP = NO;
 				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
 				INFOPLIST_FILE = "minidump_tests32-Info.plist";
-				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Carbon,
-					"-framework",
-					CPlusTest,
-					"-lcrypto",
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = minidump_tests32;
 				USER_HEADER_SEARCH_PATHS = "../../../**";
 				WRAPPER_EXTENSION = cptest;
 			};
 			name = Debug;
 		};
 		F9AE5B370DBFDBA300505983 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(NATIVE_ARCH)";
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_MODEL_TUNING = G5;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
 				INFOPLIST_FILE = "minidump_tests32-Info.plist";
-				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
-				OTHER_LDFLAGS = (
-					"-lcrypto",
-					"-framework",
-					Carbon,
-					"-framework",
-					CPlusTest,
-				);
-				PREBINDING = NO;
 				PRODUCT_NAME = minidump_tests32;
 				USER_HEADER_SEARCH_PATHS = "../../../**";
 				WRAPPER_EXTENSION = cptest;
-				ZERO_LINK = NO;
 			};
 			name = Release;
 		};
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
 		1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "generator_test" */ = {
 			isa = XCConfigurationList;
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/protected_memory_allocator.cc
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/protected_memory_allocator.cc
@@ -54,17 +54,17 @@ ProtectedMemoryAllocator::ProtectedMemor
 ProtectedMemoryAllocator::~ProtectedMemoryAllocator() {
   vm_deallocate(mach_task_self(),
                 base_address_,
                 pool_size_
                 );
 }
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-char *ProtectedMemoryAllocator::Allocate(size_t bytes) {
+char *ProtectedMemoryAllocator::Allocate(vm_size_t bytes) {
   if (valid_ && next_alloc_offset_ + bytes <= pool_size_) {
     char *p = (char*)base_address_ + next_alloc_offset_;
     next_alloc_offset_ += bytes;
     return p;
   }
   
   return NULL;  // ran out of memory in our allocation block
 }
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/protected_memory_allocator.h
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/protected_memory_allocator.h
@@ -48,17 +48,17 @@ class ProtectedMemoryAllocator {
  public:
   ProtectedMemoryAllocator(vm_size_t pool_size);  
   ~ProtectedMemoryAllocator();
   
   // Returns a pointer to an allocation of size n within the pool.
   // Fails by returning NULL is no more space is available.
   // Please note that the pointers returned from this method should not
   // be freed in any way (for example by calling free() on them ).
-  char *         Allocate(size_t n);
+  char *         Allocate(vm_size_t n);
   
   // Returns the base address of the allocation pool.
   char *         GetBaseAddress() { return (char*)base_address_; }
 
   // Returns the size of the allocation pool, including allocated
   // plus free space.
   vm_size_t      GetTotalSize() { return pool_size_; }
 
@@ -73,13 +73,13 @@ class ProtectedMemoryAllocator {
   kern_return_t  Protect();  
 
   // Makes the entire allocation pool read/write.
   kern_return_t  Unprotect();  
   
  private:
   vm_size_t      pool_size_;
   vm_address_t   base_address_;
-  int            next_alloc_offset_;
+  vm_size_t      next_alloc_offset_;
   bool           valid_;
 };
 
 #endif // PROTECTED_MEMORY_ALLOCATOR_H__
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.h
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.h
@@ -30,16 +30,17 @@
 // This component uses the HTTPMultipartUpload of the breakpad project to send
 // the minidump and associated data to the crash reporting servers.
 // It will perform throttling based on the parameters passed to it and will
 // prompt the user to send the minidump.
 
 #include <Foundation/Foundation.h>
 
 #include "client/mac/Framework/Breakpad.h"
+#import "GTMDefines.h"
 
 #define kClientIdPreferenceKey @"clientid"
 
 extern NSString *const kGoogleServerType;
 extern NSString *const kSocorroServerType;
 extern NSString *const kDefaultServerType;
 
 // We're sublcassing NSTextField in order to override a particular
@@ -48,20 +49,20 @@ extern NSString *const kDefaultServerTyp
 // this problem, but when we implemented a validation method, and
 // returned NO for strings that were too long, the UI was not updated
 // right away, which was a poor user experience.  The UI would be
 // updated as soon as the text field lost first responder status,
 // which isn't soon enough.  It is a known bug that the UI KVO didn't
 // work in the middle of a validation.
 @interface LengthLimitingTextField : NSTextField {
   @private
-   unsigned int maximumLength_;
+   NSUInteger maximumLength_;
 }
 
-- (void) setMaximumLength:(unsigned int)maxLength;
+- (void)setMaximumLength:(NSUInteger)maxLength;
 @end
 
 @interface Reporter : NSObject {
  @public
   IBOutlet NSWindow *alertWindow_;        // The alert window
 
   // Grouping boxes used for resizing.
   IBOutlet NSBox *headerBox_;
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.m
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.m
@@ -51,44 +51,44 @@ const int kEmailMaxLength = 64;
 NSString *const kGoogleServerType = @"google";
 NSString *const kSocorroServerType = @"socorro";
 NSString *const kDefaultServerType = @"google";
 
 #pragma mark -
 
 @interface NSView (ResizabilityExtentions)
 // Shifts the view vertically by the given amount.
-- (void)breakpad_shiftVertically:(float)offset;
+- (void)breakpad_shiftVertically:(CGFloat)offset;
 
 // Shifts the view horizontally by the given amount.
-- (void)breakpad_shiftHorizontally:(float)offset;
+- (void)breakpad_shiftHorizontally:(CGFloat)offset;
 @end
 
 @implementation NSView (ResizabilityExtentions)
-- (void)breakpad_shiftVertically:(float)offset {
+- (void)breakpad_shiftVertically:(CGFloat)offset {
   NSPoint origin = [self frame].origin;
   origin.y += offset;
   [self setFrameOrigin:origin];
 }
 
-- (void)breakpad_shiftHorizontally:(float)offset {
+- (void)breakpad_shiftHorizontally:(CGFloat)offset {
   NSPoint origin = [self frame].origin;
   origin.x += offset;
   [self setFrameOrigin:origin];
 }
 @end
 
 @interface NSWindow (ResizabilityExtentions)
 // Adjusts the window height by heightDelta relative to its current height,
 // keeping all the content at the same size.
-- (void)breakpad_adjustHeight:(float)heightDelta;
+- (void)breakpad_adjustHeight:(CGFloat)heightDelta;
 @end
 
 @implementation NSWindow (ResizabilityExtentions)
-- (void)breakpad_adjustHeight:(float)heightDelta {
+- (void)breakpad_adjustHeight:(CGFloat)heightDelta {
   [[self contentView] setAutoresizesSubviews:NO];
 
   NSRect windowFrame = [self frame];
   windowFrame.size.height += heightDelta;
   [self setFrame:windowFrame display:YES];
   // For some reason the content view is resizing, but not adjusting its origin,
   // so correct it manually.
   [[self contentView] setFrameOrigin:NSMakePoint(0, 0)];
@@ -96,56 +96,56 @@ NSString *const kDefaultServerType = @"g
   [[self contentView] setAutoresizesSubviews:YES];
 }
 @end
 
 @interface NSTextField (ResizabilityExtentions)
 // Grows or shrinks the height of the field to the minimum required to show the
 // current text, preserving the existing width and origin.
 // Returns the change in height.
-- (float)breakpad_adjustHeightToFit;
+- (CGFloat)breakpad_adjustHeightToFit;
 
 // Grows or shrinks the width of the field to the minimum required to show the
 // current text, preserving the existing height and origin.
 // Returns the change in width.
-- (float)breakpad_adjustWidthToFit;
+- (CGFloat)breakpad_adjustWidthToFit;
 @end
 
 @implementation NSTextField (ResizabilityExtentions)
-- (float)breakpad_adjustHeightToFit {
+- (CGFloat)breakpad_adjustHeightToFit {
   NSRect oldFrame = [self frame];
   // Starting with the 10.5 SDK, height won't grow, so make it huge to start.
   NSRect presizeFrame = oldFrame;
   presizeFrame.size.height = MAXFLOAT;
   // sizeToFit will blow out the width rather than making the field taller, so
   // we do it manually.
   NSSize newSize = [[self cell] cellSizeForBounds:presizeFrame];
   NSRect newFrame = NSMakeRect(oldFrame.origin.x, oldFrame.origin.y,
                                NSWidth(oldFrame), newSize.height);
   [self setFrame:newFrame];
 
   return newSize.height - NSHeight(oldFrame);
 }
 
-- (float)breakpad_adjustWidthToFit {
+- (CGFloat)breakpad_adjustWidthToFit {
   NSRect oldFrame = [self frame];
   [self sizeToFit];
   return NSWidth([self frame]) - NSWidth(oldFrame);
 }
 @end
 
 @interface NSButton (ResizabilityExtentions)
 // Resizes to fit the label using IB-style size-to-fit metrics and enforcing a
 // minimum width of 70, while preserving the right edge location.
 // Returns the change in width.
-- (float)breakpad_smartSizeToFit;
+- (CGFloat)breakpad_smartSizeToFit;
 @end
 
 @implementation NSButton (ResizabilityExtentions)
-- (float)breakpad_smartSizeToFit {
+- (CGFloat)breakpad_smartSizeToFit {
   NSRect oldFrame = [self frame];
   [self sizeToFit];
   NSRect newFrame = [self frame];
   // sizeToFit gives much worse results that IB's Size to Fit option. This is
   // the amount of padding IB adds over a sizeToFit, empirically determined.
   const float kExtraPaddingAmount = 12;
   const float kMinButtonWidth = 70; // The default button size in IB.
   newFrame.size.width = NSWidth(newFrame) + kExtraPaddingAmount;
@@ -213,17 +213,18 @@ NSString *const kDefaultServerType = @"g
 
 // Rmevoes the email section of the dialog, adjusting the rest of the window
 // as necessary.
 - (void)removeEmailPrompt;
 
 // Run an alert window with the given timeout. Returns
 // NSRunStoppedResponse if the timeout is exceeded. A timeout of 0
 // queues the message immediately in the modal run loop.
-- (int)runModalWindow:(NSWindow*)window withTimeout:(NSTimeInterval)timeout;
+- (NSInteger)runModalWindow:(NSWindow*)window 
+                withTimeout:(NSTimeInterval)timeout;
 
 // Returns a unique client id (user-specific), creating a persistent
 // one in the user defaults, if necessary.
 - (NSString*)clientID;
 
 // Returns a dictionary that can be used to map Breakpad parameter names to
 // URL parameter names.
 - (NSMutableDictionary *)dictionaryForServerType:(NSString *)serverType;
@@ -381,35 +382,35 @@ NSString *const kDefaultServerType = @"g
 - (NSString *)clientID {
   NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
   NSString *crashClientID = [ud stringForKey:kClientIdPreferenceKey];
   if (crashClientID) {
     return crashClientID;
   }
 
   // Otherwise, if we have no client id, generate one!
-  srandom([[NSDate date] timeIntervalSince1970]);
+  srandom((int)[[NSDate date] timeIntervalSince1970]);
   long clientId1 = random();
   long clientId2 = random();
   long clientId3 = random();
   crashClientID = [NSString stringWithFormat:@"%x%x%x",
                             clientId1, clientId2, clientId3];
 
   [ud setObject:crashClientID forKey:kClientIdPreferenceKey];
   [ud synchronize];
   return crashClientID;
 }
 
 //=============================================================================
 - (BOOL)readLogFileData {
   unsigned int logFileCounter = 0;
 
   NSString *logPath;
-  int logFileTailSize = [[parameters_ objectForKey:@BREAKPAD_LOGFILE_UPLOAD_SIZE]
-                          intValue];
+  size_t logFileTailSize =
+      [[parameters_ objectForKey:@BREAKPAD_LOGFILE_UPLOAD_SIZE] intValue];
 
   NSMutableArray *logFilenames; // An array of NSString, one per log file
   logFilenames = [[NSMutableArray alloc] init];
 
   char tmpDirTemplate[80] = "/tmp/CrashUpload-XXXXX";
   char *tmpDir = mkdtemp(tmpDirTemplate);
 
   // Construct key names for the keys we expect to contain log file paths
@@ -539,17 +540,17 @@ NSString *const kDefaultServerType = @"g
 //=============================================================================
 - (BOOL)askUserPermissionToSend {
   // Initialize Cocoa, needed to display the alert
   NSApplicationLoad();
 
   // Get the timeout value for the notification.
   NSTimeInterval timeout = [self messageTimeout];
 
-  int buttonPressed = NSAlertAlternateReturn;
+  NSInteger buttonPressed = NSAlertAlternateReturn;
   // Determine whether we should create a text box for user feedback.
   if ([self shouldRequestComments]) {
     BOOL didLoadNib = [NSBundle loadNibNamed:@"Breakpad" owner:self];
     if (!didLoadNib) {
       return NO;
     }
 
     [self configureAlertWindowIncludingEmail:[self shouldRequestEmail]];
@@ -587,78 +588,79 @@ NSString *const kDefaultServerType = @"g
 
   // Localize the header. No resizing needed, as it has plenty of room.
   [dialogTitle_ setStringValue:[self shortDialogMessage]];
 
   // Localize the explanatory text field.
   [commentMessage_ setStringValue:[NSString stringWithFormat:@"%@\n\n%@",
                                    [self explanatoryDialogText],
                                    NSLocalizedString(@"commentsMsg", @"")]];
-  float commentHeightDelta = [commentMessage_ breakpad_adjustHeightToFit];
+  CGFloat commentHeightDelta = [commentMessage_ breakpad_adjustHeightToFit];
   [headerBox_ breakpad_shiftVertically:commentHeightDelta];
   [alertWindow_ breakpad_adjustHeight:commentHeightDelta];
 
   // Either localize the email explanation field or remove the whole email
   // section depending on whether or not we are asking for email.
   if (includeEmail) {
     [emailMessage_ setStringValue:NSLocalizedString(@"emailMsg", @"")];
-    float emailHeightDelta = [emailMessage_ breakpad_adjustHeightToFit];
+    CGFloat emailHeightDelta = [emailMessage_ breakpad_adjustHeightToFit];
     [preEmailBox_ breakpad_shiftVertically:emailHeightDelta];
     [alertWindow_ breakpad_adjustHeight:emailHeightDelta];
   } else {
     [self removeEmailPrompt];  // Handles necessary resizing.
   }
 
   // Localize the email label, and shift the associated text field.
   [emailLabel_ setStringValue:NSLocalizedString(@"emailLabel", @"")];
-  float emailLabelWidthDelta = [emailLabel_ breakpad_adjustWidthToFit];
+  CGFloat emailLabelWidthDelta = [emailLabel_ breakpad_adjustWidthToFit];
   [emailEntryField_ breakpad_shiftHorizontally:emailLabelWidthDelta];
 
   // Localize the placeholder text.
   [[commentsEntryField_ cell]
       setPlaceholderString:NSLocalizedString(@"commentsPlaceholder", @"")];
   [[emailEntryField_ cell]
       setPlaceholderString:NSLocalizedString(@"emailPlaceholder", @"")];
 
   // Localize the privacy policy label, and keep it right-aligned to the arrow.
   [privacyLinkLabel_ setStringValue:NSLocalizedString(@"privacyLabel", @"")];
-  float privacyLabelWidthDelta = [privacyLinkLabel_ breakpad_adjustWidthToFit];
+  CGFloat privacyLabelWidthDelta = [privacyLinkLabel_ breakpad_adjustWidthToFit];
   [privacyLinkLabel_ breakpad_shiftHorizontally:(-privacyLabelWidthDelta)];
 
   // Localize the buttons, and keep the cancel button at the right distance.
   [sendButton_ setTitle:NSLocalizedString(@"sendReportButton", @"")];
-  float sendButtonWidthDelta = [sendButton_ breakpad_smartSizeToFit];
+  CGFloat sendButtonWidthDelta = [sendButton_ breakpad_smartSizeToFit];
   [cancelButton_ breakpad_shiftHorizontally:(-sendButtonWidthDelta)];
   [cancelButton_ setTitle:NSLocalizedString(@"cancelButton", @"")];
   [cancelButton_ breakpad_smartSizeToFit];
 }
 
 - (void)removeEmailPrompt {
   [emailSectionBox_ setHidden:YES];
-  float emailSectionHeight = NSHeight([emailSectionBox_ frame]);
+  CGFloat emailSectionHeight = NSHeight([emailSectionBox_ frame]);
   [preEmailBox_ breakpad_shiftVertically:(-emailSectionHeight)];
   [alertWindow_ breakpad_adjustHeight:(-emailSectionHeight)];
 }
 
-- (int)runModalWindow:(NSWindow*)window withTimeout:(NSTimeInterval)timeout {
+- (NSInteger)runModalWindow:(NSWindow*)window 
+                withTimeout:(NSTimeInterval)timeout {
   // Queue a |stopModal| message to be performed in |timeout| seconds.
   if (timeout > 0.001) {
     remainingDialogTime_ = timeout;
     SEL updateSelector = @selector(updateSecondsLeftInDialogDisplay:);
     messageTimer_ = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                      target:self
                                                    selector:updateSelector
                                                    userInfo:nil
                                                     repeats:YES];
   }
 
   // Run the window modally and wait for either a |stopModal| message or a
   // button click.
   [NSApp activateIgnoringOtherApps:YES];
-  int returnMethod = [NSApp runModalForWindow:window];
+  NSInteger returnMethod = [NSApp runModalForWindow:window];
 
   return returnMethod;
 }
 
 - (IBAction)sendReport:(id)sender {
   // Force the text fields to end editing so text for the currently focused
   // field will be commited.
   [alertWindow_ makeFirstResponder:alertWindow_];
@@ -712,26 +714,26 @@ doCommandBySelector:(SEL)commandSelector
 
   NSString *countdownMessage;
   NSString *formatString;
 
   int displayedTimeLeft; // This can be either minutes or seconds.
   
   if (remainingDialogTime_ > 59) {
     // calculate minutes remaining for UI purposes
-    displayedTimeLeft = (remainingDialogTime_ / 60);
+    displayedTimeLeft = (int)(remainingDialogTime_ / 60);
     
     if (displayedTimeLeft == 1) {
       formatString = NSLocalizedString(@"countdownMsgMinuteSingular", @"");
     } else {
       formatString = NSLocalizedString(@"countdownMsgMinutesPlural", @"");
     }
   } else {
-    displayedTimeLeft = remainingDialogTime_;
-    if (remainingDialogTime_ == 1) {
+    displayedTimeLeft = (int)remainingDialogTime_;
+    if (displayedTimeLeft == 1) {
       formatString = NSLocalizedString(@"countdownMsgSecondSingular", @"");
     } else {
       formatString = NSLocalizedString(@"countdownMsgSecondsPlural", @"");
     }
   }
   countdownMessage = [NSString stringWithFormat:formatString,
                                displayedTimeLeft];
   if (remainingDialogTime_ <= 30) {
@@ -792,17 +794,18 @@ doCommandBySelector:(SEL)commandSelector
   NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
   NSMutableDictionary *programDict =
     [NSMutableDictionary dictionaryWithDictionary:[ud dictionaryForKey:program]];
   NSNumber *lastTimeNum = [programDict objectForKey:kLastSubmission];
   NSTimeInterval lastTime = lastTimeNum ? [lastTimeNum floatValue] : 0;
   NSTimeInterval now = CFAbsoluteTimeGetCurrent();
   NSTimeInterval spanSeconds = (now - lastTime);
 
-  [programDict setObject:[NSNumber numberWithFloat:now] forKey:kLastSubmission];
+  [programDict setObject:[NSNumber numberWithDouble:now] 
+                  forKey:kLastSubmission];
   [ud setObject:programDict forKey:program];
   [ud synchronize];
 
   // If we've specified an interval and we're within that time, don't ask the
   // user if we should report
   GTMLoggerDebug(@"Reporter Interval: %f", interval);
   if (interval > spanSeconds) {
     GTMLoggerDebug(@"Within throttling interval, not sending report");
@@ -1050,50 +1053,50 @@ doCommandBySelector:(SEL)commandSelector
   [commentsEntryField_ setMaximumLength:kUserCommentsMaxLength];
 }
 
 @end
 
 //=============================================================================
 @implementation LengthLimitingTextField
 
-- (void) setMaximumLength:(unsigned int)maxLength {
+- (void)setMaximumLength:(NSUInteger)maxLength {
   maximumLength_ = maxLength;
 }
 
 // This is the method we're overriding in NSTextField, which lets us
 // limit the user's input if it makes the string too long.
 - (BOOL)       textView:(NSTextView *)textView
 shouldChangeTextInRange:(NSRange)affectedCharRange
       replacementString:(NSString *)replacementString {
 
   // Sometimes the range comes in invalid, so reject if we can't
   // figure out if the replacement text is too long.
   if (affectedCharRange.location == NSNotFound) {
     return NO;
   }
   // Figure out what the new string length would be, taking into
   // account user selections.
-  int newStringLength =
+  NSUInteger newStringLength =
     [[textView string] length] - affectedCharRange.length +
     [replacementString length];
   if (newStringLength > maximumLength_) {
     return NO;
   } else {
     return YES;
   }
 }
 
 // Cut, copy, and paste have to be caught specifically since there is no menu.
 - (BOOL)performKeyEquivalent:(NSEvent*)event {
   // Only handle the key equivalent if |self| is the text field with focus.
   NSText* fieldEditor = [self currentEditor];
   if (fieldEditor != nil) {
     // Check for a single "Command" modifier
-    unsigned int modifiers = [event modifierFlags];
+    NSUInteger modifiers = [event modifierFlags];
     modifiers &= NSDeviceIndependentModifierFlagsMask;
     if (modifiers == NSCommandKeyMask) {
       // Now, check for Select All, Cut, Copy, or Paste key equivalents.
       NSString* characters = [event characters];
       // Select All is Command-A.
       if ([characters isEqualToString:@"a"]) {
         [fieldEditor selectAll:self];
         return YES;
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4cfd32c54b7f216718ef1a97d69bd92a2a92a143
GIT binary patch
literal 156
zc%1w9pFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml<
f14T-JtRkSSH3JtGQ(PD_fjSC+>_mo2a?At(uMryf
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2b8bb969398e68e8cec2fb664b816d9c5761a3d4
GIT binary patch
literal 2428
zc$~#n%Z}4P5bQHwVMXM!heU7$A@N#iC3YbqTJDqhk!)<o@*}JKFyFuls4kD~vGZ71
zEkc&<@l1DBclGonzkW{TLOhvEDY>jAl}HMFhqA@DC%5<tIQop45*8uur5KL4u=nr`
z@ie%Xur%;kVSFJ|c_t%g?jt;m#ITR#3aCbWVvk_`2KPv2_|jGNNN@#U@nkG-@vNgT
z;3|MoVWqU|mFzG|?e_#Yug@^wU?y@n=d#C)`Zj!OrA#T}%Q5Fkb`V$IMpVIj!(0?&
zf|*OIqP7_>)lpFkj1s(kczE<kIUA5iSya(@knaLB0rOLg7+$+xlzp_7+{t%XWyI4s
zeP*KeYqF$H4TD~GHB-{lP*qH^_Th<YxCK{}Pn~nXxI?_}u+r7;H0%GW-=Ea&g*^W!
zwX3^v!MQr4vAiUgTd5^?SYoSO94K|wGH3+F0gLulKZ?Vh;n~_XJ{ptir)S5GJ}bNp
zEqtqkt_M_CGx@=}lqd^~E4=+d=PH|_s>2+<_1OE&KF=@D@%9)=&KL{YG-~g#u3uYf
zWiTpRjELRh*{GWOhSa65xUovCnXj?c)?6az><p<}ZgB(h#L!pg&ed(ky`ufO!b*J5
zVLRePz|Y$(I)6jP{D_u+hug*1Azb6F6^|XS%Xalu%bD4#DBJ$1*Q~WDF|VV7y{2Q;
zd*kpoz4jIFrXSziUjVJ2dluA|!|v^V5w!YC#&R6t9kSO-?t$W-MGf+CuP^fHMD8=2
zla6nZ!L{SHB2ot3rnv5TO`!jl=R?fXsNNgX0cz%;PKc9GU3W)S+zmcP_ZZcEq**K(
zyKnbdMWx)zjH#b$z9B}_#dQ}fU>z~CPSc0E=JuaO#T}TRWjn=mj_Zc_6?^!6UP)_N
RJ~A(t>!G|lwjqzQ{00iMqb>jd
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3180973eacedb2f7b1e4ab897a7343ed43c64329
GIT binary patch
literal 192
zc%1w9pFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|Opu@X=|l_3KxSHzG6CNmk5
nfg&Yfb}^7n1mY5~8R<av)(l)&%yj|kDrP7EvJ)99sbdQOp~NFV
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..73da36f48b35902943a91752a8f9d5df5f82fa90
GIT binary patch
literal 2746
zc%1E4O>fgc5S=r>!ivbHheYBCLV{2bh!(0wEoVD+>?pPq#dfUb_wpM!0&m`~vzx{w
zNacvE&F+rp^Ud3Je*GNFg#<E{S~jwfQc|g~pUVpSK<=<hxcUM~4UIX*OhT?#&=2rC
z$8U%+gJuYe4C@OS%QG2xvP)Qml0!e0kMJ5wOy2`&zs49qBV_a&NL5QM3p{}g<qdvY
zX&_Up0IQPLEp#@>Ccy|K!kpku%>4*HU!BO}8j`dp{)E<wM*@!(o(Bw#QP{{aD=uvX
zNl(rytB9!TmP9RMjxjX07Q4tsQVi$Jd<5xx+6D3fk_@?;4oo;ZKRz1z#$=e|F;Now
zn6e6!ZHHsE$4F&M`GL8#yM{GtUJL7`i=7dTh8!_(T(2T#Sx~ZrPC)H^Uz6#BcA|v#
zyMM@uj9d(uZ&$-1ZgXZ@!!|j<$g$(kIsIqI-!kN$b3}~IozXF+t7IrI<T<^cX2=Zs
z2A>jnR!2RUAa2b{4t=;vG;;Ms7B6i5h3D5)r|53zIkItE%ZjbNH9Nbv<VMXd?66Pw
z_92GjpK6Ejmmk&ojS>9XKH2EXfzC=J#grQCO)pbc+SkDrRvXXfk{zmHwdB2S7+dn}
zgyc)*SrtTa!(2-Hr6{~FLbB&=iKr?~&-VBRF+xby^9t+7w}3LHlJC&n;jLk~X8!rW
zPsqHFQ9b8<Zu{9%J7>l&SLf#nb412DTi1n``^ama!YyMy^jcjKuY^3+S{has$nF00
z=47B5s^{|Q&gL!VHPNrZ?1pDzMNM~74(|j1RJ$*ua%IN+`n@QNBO+u_ceZ+OPOZ;=
z+pp+QKPoru#DeQP)N<unW%RTLqGLQQpAmYp;{B;-bYvMce&luSc^%PDLEL@bHRMW+
zRg0B5aZ^^eVkL%+4ex2cXG7l8s=2f`ykYv*-h8=tC&UN;J<i9R+W%e+nYuX>^<2zT
aQLh=PA^T2O>T5owPT$YDI(^;K5q|^lK;9Gp
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a82c013e059dbf7918192662fe2d4030ff6aee37
GIT binary patch
literal 184
zc$}q;yA6Oa3`Aee6j9bdG=M1C!6HOL3Lg<DSRS|m=qOIM@8|o$)6h|KvJgm&^cb_I
o$59Dh%*w$;6b7k5_bw&K<;0qDNnDn<r1<D;mCS6~jqCr17aLI^C;$Ke
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c31d6f48bb2c7e913abc209842492eeb7d2364af
GIT binary patch
literal 2578
zc%0o<O>fgc5S=r>!iwNhRf*t8g;Z#fIJ77b^#{1NlNi~tv7J=;xjk~=)Efuj&6~Be
zaZFPVTu^22crx?m&ByNc*UyQZNFXz5q>@xtvXC0zb1Cp0$PK;{N*|$VU@^xNNl3YX
zeSr5I?+{M}%Mcz*$R{$9XEO41m+%NBgZ)B205z1D*dtiK!84L8qJ&by%A!PA9~k9@
zoa3!*0$^D*^{$9h;9J=zuqdflZ74b96}Toc2L9P2jIN<scwF8?uklhm>Yp>_7Eea+
zfb4U*r`+dUI4%L!!ZBVsJYyT8Y6)x`$Fv4R?Sr3R<*KCiYx--B)|;G`U!m8v<Qh}f
zj5o}za(%JdmDE^;x3G^r3-yV}x}i-)T}H18`di3WgSL)ZNzLuzpY^xT$?6cfsk3_6
z1Qd*Nc7)Ua-Qkz={AiaI@e8p{r+%;K=XX^roOe5?KB(K&oeguKY$%_)Xg|nL>ruOi
zHRKE|+KN3kSyu0wRY{>wiDk9XDtzNv6G5tI@xU0iyW4JMj#tK>@AkY!NTKa#GlMqh
zILD6lnsUniMBbDpWE*iJRb%sT%4`aFRE%U;rJIqeLr;j&&U8qe{h78&jNKds^pBWd
zieK)zKU(~DGBxkU<(zQJ{@lwcXIl}M>`Z@$ntkH<RqR^Lx|d!LEzV(WkD>Qbc06|&
zdPdx`&O5)$CwHRdRFeCKY_@}#Q!@O{do1dvFWB=;IS;YNvvxE28EeVeZ{!{N*07VS
zz0<|tqx-vhcN2v?<CNJj%7teU_D;E(<1*~|mR_an<8WQ91}Wtm<aFivFNs;oYuw`#
zx#Qm$JE!1Tn(;=pX_@p;OAmESoP4j>>b2&C>E6DBWP5VPeiqEhCUwn|%J14IcM68?
z&WPQeu^?j1Y4vaV<B?|Wzn*nh;lo(Nk^1{=DAG02*Y1pZdQN%g_q2@sIDeCoAIGBn
E1`eRYhyVZp
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4cfd32c54b7f216718ef1a97d69bd92a2a92a143
GIT binary patch
literal 156
zc%1w9pFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml<
f14T-JtRkSSH3JtGQ(PD_fjSC+>_mo2a?At(uMryf
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c32f8ff7a6219853e541db1bf3df512b3f5e7786
GIT binary patch
literal 2694
zc%0={OK#gh4CT5v=uR-2P0-qCmkk0m{Qw2(v_Xs<VB*M*09jJ>Nf4i=N6Rw4MBB&5
z(a(15py;kJB+m@VNAi(F`}ePr97-S)DJ7Rk5}8YZ{Y+Bq1G&I1<mx+4N@&dROvQ1X
zLO;NJhPT5rg{FhWHP(kRk{2@QoPCCclNkDQ`3h7gSHvDb`xwta#_}?7lHn6?csY;{
zco)zJ@h-70X}w_7E35<J1vqgyiR2Md-K$)YR6l`Eh3|nJ?TGFaC-YuhA${M|^CLXy
zK4cWJgk;PCx1>kgZOcL>2{O>N+Gg|}Ao>!I?lq$lNV#0%q>v$Np!w$>Go^;{UE66E
zE3Pc2TWD28&bYe8`I50JdkN+DzOD}qx2BsDJMy(Lx$Tms{w9gZLWXsUXk*XI&~vNo
zCXjskr}cMaLSvbVv6wUO3TvxLPI*P#qdigle|3H<ulCg1A?p=0N||L&yLYtf)>ipn
zkRi>n*x>TS<1Xb5D`0UxFpHE`ilD!%lLBJvtzI$n2>CeA=#=ssphjy`!MHBSlIvL1
zK4O33=zZ99NyxboLB5{J7e+DjjOk=i{2KR`bI~S^cC>Xy!TpL}r<A9(yy5hD-K$;F
zsiIA^&`+ynGt*k_y6+uvjlY5{v^b9X)`ypjC*>5Z(XQB0mTf`%%J=cAsi;aVmt9pq
zBcEE0Ye?da8{OA$F_llXt6)?5n=`}tW;OPC*oM=_+v1Gztz5*t9(`WDe#-kMvaIRE
zDel%b)N}OjyqOoqxK(Y|o1~7nOmB7@Z{dHV&hcH(fRCIwB@y~v*}dP^-~H*){>nK{
zOpS9p+6i_ESq#@E=fp>}-R_5cdxDuWRx9HA0{M(PR@X$z!0HH}JAQ`XEag;=c`vPV
zMr){92X#oC1-b9`XGMOmu)4#_Zu5k7O__;xZAGrSbvuA8U<GPTtDtpA>2G}ZMm*2o
q#Q(3V*va`GkDLD1@833mr}R<z_;%&D=xP34c3p4#vg`VLDz`s4iRb44
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4cfd32c54b7f216718ef1a97d69bd92a2a92a143
GIT binary patch
literal 156
zc%1w9pFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml<
f14T-JtRkSSH3JtGQ(PD_fjSC+>_mo2a?At(uMryf
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a4b7fd3acd5f3b8030d47d81fa4c3db03a1d987c
GIT binary patch
literal 2590
zc%0={O>fgc5S=r>!iuOWRgegdASAv;MG6(6KfrMk+mh|IV!IXnh5VGBxp4vBz8%{e
z$4#lk4Ow>9<C%GH-ptzh{c9#C639Yo*-9#f#8TmYBL??@T;Oia)hAeLcx-S+5^`<e
zAK<#dHN+XgGeks!^@+^nflNHxTSSDC!9SJ{$QsIuxhL>`fpa2rIfk{wktxcxqO9@!
zNM7Pv!4k*~(Gsj1SS)rbIpVhPzQmEznj@|N)3r>I{rLetXRyQ`lT+9oR>k<77?wrG
ztBtdYx%C)h%d${~9RCDQ3)%u|T`9X1rvbx2z7w;ix<>U}cXthQZ57Y<r}avh-zihV
z?+5iLs6*JXY!xiEqaoF+I}gh;!*LAzs^hj9>BNejf$F`aCRU+VWvjET^UXi*eZnf7
zb`hV|MDX>oS+`Wj@A~a*{+G@_k%tGnZ@qHZV%B4bwpHz)GS=^|RX^|cSGA|&S7l@~
z#N4NLHyX}PIzW%q(rRPC;F2uYtY&P|+zeLKDW!J-i_^sD8{vk^G_XYUt@ylTM4!WE
zUvd^A#`ZJgkSzYNy7$zl@K7Dg8fZp4VC%F<*EkF(=y8|t5qTJ$qrBr?=ma=jYMms<
zG2-m{T@S%~=_$KZ^<tg0mG&T&pIWQS>^gj?o9FNdsanEr4EO4;f6DJgNNc7Qq@2Kg
zCGW~SmdAKZ`%H7zZ?);8-+3B8>(EP`5u5qjXxu64a9_N<Lk)F$GBOSZS$am5PQe%a
zwtMq6XS-%ccTwEFZ0BXTqx)}^eP2XmIiBkk-zP0Q|1GyrKI3tp<>M{7oKy9b>kCvf
z_o5PJDxv8N#}$t$=E!i`GQMfuOw0yZOE2q`d2%Z6PhP_*vis-?E4SBd6>dkYbRHY3
z<##Ptl|r5OBlrgFM;n>$eE080TIfHZhN^ByvBq%B-fkL0I%D>RUzPjSly{MTQ<0Bz
KpNe{vww^z~w!;1Z
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4cfd32c54b7f216718ef1a97d69bd92a2a92a143
GIT binary patch
literal 156
zc%1w9pFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml<
f14T-JtRkSSH3JtGQ(PD_fjSC+>_mo2a?At(uMryf
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1f1a4fee5cd6f98defce31446463266b67048904
GIT binary patch
literal 1792
zc$}?OJ!n%=82u_J>f-KVh<54F9Nkm|i5-OeH3=cs4Dt2lKWP%%Bqf!K6_La$l!z$0
ziGvOf;vnMWAm}Czc5)~k#OhWzi|M(yA$d*Grb7wu-Fx5rzH`oZ?)Pq*{~a<SHVH~e
zrX?+TNy-e@2`O-GlMq*NJ@fKOi4h52rWkr&V7!g@1n&kflaU59Qk;*7Lyn5w@@$M5
zhU6HZl*>dlB&M<LjK09jF3+)yHN3$F-r*<KVUuCGs2EW5o=8S;70&s)-Y{+=j3^Gk
zF6VdQ@bF2}g6`oPlQSQywaFDp;RamDqnkC00<K4!j}=b@56R;Txt}ypoqigbz#^F!
znDqxgnDH5nw#qDqmR5W!B8U{+NWw#eiMCFqG*4xh_Q8>)b|j1p#_$rq_}-1#2c8~h
zcIMkZceXomT25Kq2qQs-QCx$Mo(y4F&a~b)a5jD?q}*~%z6$t>o58&vzf5YK;xEoh
zN>tpfTJ?j%_*?M=vTzb3N+;YklcU;&Mq6D+iJ$RGi`v!I`dlu*qXIj5r|3(Xo^>;S
ziZ0YMa3-?&SdGHK;-k6B!CNlWadOF+Z{T~-B;#$=$eL#_IB_3EvaV3gZ@T)0%HC67
z-2W_~wE3tk#Ms@cAEyqrOL6XHf%EQec}w(l)_S=4&wI=`((J8b5W@D%?YVA_lU(O4
z@mtj#Z!;D3DN@lK)xH_a?A90f%5K`=&aCON!#1O9jY)uGQJ+C2aY~u@l0I!ZIGwIj
zebzY%3`Uunvwz-etkR<oRBio6f-T<uIX-bo{|d*oi)lR%QMKEWmC{H>ImeUGA+!27
z${s4{?=MHj(bf(-x=@Q2)KQHyr9HIvMOpVmjI&wJwz^YQVQTHMR=1S(w{P{|$=+Ar
sX^g9H)sAn25reJ&hqCUW=>eF#p?Wluayq^zoreO0bXpPjrgIB(6U0H63jhEB
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4cfd32c54b7f216718ef1a97d69bd92a2a92a143
GIT binary patch
literal 156
zc%1w9pFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml<
f14T-JtRkSSH3JtGQ(PD_fjSC+>_mo2a?At(uMryf
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a4a54f75936fbbd8ea7d1ddd578555cbbae9d996
GIT binary patch
literal 2546
zc%0=`%Z}4P5bQHwVMXM!f<$lxA+f+p9Cjfh+Pyor^C0m<ek59cnm+)lt0(qk*Xu|~
zoRDRE#?w<>UEMwY{c9>063AR?DP<#>tfazxDLLkW++vn+^aWpPSS)cz5^|iwKEQK{
zXNWt3Wr!VXj4xy=&t&9%`-B~#>|no=&p-_&CiV!{?{JS`k>Fj!B9Vf-D#t01vAoA~
zLw4$S&%Fm&MZm84eT8oo_ZN6hfcSQR!wtTyJnzb>#;B5eq9nLd%o9c#;%R)J;%Ih1
zF#FC?hLIsI@cv28JMN3YEs!g>L%9{WRPnlvaSPiJS4rfQ<1N=?svk&0tB@F`hO%zR
z(EQu}qjou?SvyVzR&p@gwQ<&rOxJf<HH-~o&b-Vg4*#gG>YD-S<3GrA;#g=kHe{_F
zO=*2@8I#Xuh|B+!?^p8N%lTMdyLn%Z4QoN}ec6qOlDaymdUaGZ>&t4e#&X&j3)QCL
z`I0fp+?_eLx?nGBZ<kbf@9Yjv4Lg-oE45S=V(#0wI5zKkzpD|`cLN3wW4Xk)%4yxe
zSK!$OtmKlsERq%DT7u6D=B5F|tmT<FoQS&AJgGW`16EPYnlXEgGN8^$%fEKME9N(+
z{mLo4VC2KOnz5?1Yu8xWJ?g|Or>oXc!aP}IDebmir9am09JZap_LoSA-tp{EuJK;D
z)sEH6cKztLU>)q~@xFK0?8GAA%>E5K*P~q=ifEM=%Qtqmb>jz~Gc`GP$ah}1HO$Rv
z4|o3=?aqk2`jIYKA&u*Z^5oQ-J3jq8zaks`TFj{ahT~gAbM5U~6RD6l_#01AV|q=H
z(VQouvY5D<nLa=*Jk$ws(vu8EJd?F@v~v#_Subf6R`Ic`zlLi0nHpm)p#De8<H?w~
ylelzR`2X<p{^qV;8&+mH=yAx~kiQ%HXt-}UzSOh)+vt36=b}6Mvp?li-u?hGGrCUz
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4cfd32c54b7f216718ef1a97d69bd92a2a92a143
GIT binary patch
literal 156
zc%1w9pFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml<
f14T-JtRkSSH3JtGQ(PD_fjSC+>_mo2a?At(uMryf
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..725ef5a26298400705791e12a36c232a8262fd3f
GIT binary patch
literal 2484
zc%0o;+iuf95S?ef!ivaCB@)3S2&r5uRicH6s2{M2W5;%EN4})W2l6T58+ZcF9Ix#q
zx3-8UWZB-!%sDe>X6;`;$8sT_Or?@SBFQ9_67xWE%ssioY{AiItW>ZFaL>hXoWtJ3
zGr-f}p2O0>V~O#FjOCdOoVAbeFtUPuDAzzW;uCuS>$kWEGQmuD)g#5V0E;I>xx{mc
zHI1W|4c0U4G`j}#5~ww1&Dsb^Z_aSvVkLA~r?SP0`nHT}rN|i~EU@Ou`XI8xi7Ao<
zm)gz15it_=*&((F7Kx3^lPfBwC~I7*v0650uCHd()S!*2#4N?z$DRj7L!^>g_~h1#
ztUA5g3ho$Z42u;Q)lLz8yAx2KiVE(!JT;P5jaE(7GsE78e^gIp{b6g?Xyq{%jcLJ5
z`Z}KG{r_wEQl3Alo@zDYN|WtSUJ=2q<DC4dJxAq%iq{>!>R0lMu(O%C*oWQX@pQJ)
zsBMY-^vklL#}aSjD4@GBJ(|1&^h9yAMirGR<U4%gy>qVYhKlWH@{Jj2eM0QF9k!4c
zteAF+vDuW=--BIjWAH6&ioCU&p;HA{m5Lc9{2J;wq1TfAQc{tKRt4EZ+aUo}YjkXw
zw5MaPovYOZRtBpJFyt8TpSk1@dqaleh*A&XY#2|7I1Ag!eM~*d4c;^MO7D5)sQbEO
zUfV8E&h1gZuT&xH{z5B`;!dyJc81PNs=eVjb0TZckYcrG^1b~x<h1O+6piKn3GV+L
zdMf9P@i@Xe@Xz40b-eUT)gmAF`XZlBXfk0PB98Bn!Hwg!B+?psj&a@d8bPI;r$jqx
zWIJWNhq`u9N5n~~y4znhd&S4-9;4<AX%=(F?%S@bsgzr>A@x(u6Jq$bRw1jFu>*Ea
rKR=FbYCE82hZbk~PIH}OyCp--|HS#+($2E_>)c$nhjMfIPI3JP*M+v{
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..585f6221dc91a2e19ef05347bbee12e0626e227e
GIT binary patch
literal 184
zc$}q;u?|2$5JaC=;veLGLo|p|{K5qV!HGlS=P`PnVrC~Zv%A-gA*Uo`XQpMOqrx(2
p8e&qxP~%u}K_vH3`nDP+PVmxR+Z%(}kPv>{Ea=r*q%G(F4-fv7AMgMG
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b7dfeecebe02c401d3d6e6f124fe16974d81fd60
GIT binary patch
literal 2632
zc%0o<%Wl(95S?t1`VUq`H&salOAr#`A+cytMbz$ZY}aw(M^xLX$bwG?&YU|=Zqg*B
zVuvDM-^V=8oS8e$?_VQ1mq^Ca%Dv=LNhS@}cT!^=$qiO1XWy{XLgEfjERORU@)5>6
zj1Er>Ne7K7=I1h!7jhcxeTIgU0`i%Bg;ggBZJ$E=J)Tp!#!63Bqr}dce88v(BAIcl
zFfNGnWZ+~D=_O<<ydzm*re}o=Ve8!y?^oE#0>5LNHHavs*W9Ag9o5LOT5KW9i9~hO
z?*y}rR8AZknKCpq4qM{9XA~Z-kH_oQ)UD~`WZ-u$us5gGjNBF&r;OOkx<Nr3E$t{%
zs*zAu&r8fQ<|$nx)7TOs=rcKoM2z>0rz-msye{$XIaC%E@uz>zW1m6Q^|%XLho0*o
zdx!o0j~RR|FQ3SwBAZ}W_1wVULDhUi%`jszbxX^2^N25>p$7V;Aq~CF%wJ{sQ_fZx
zk!!@(?$nCEd&>917%drtvR&itZ|Q~&&$++VE0gj3UswiGtJ3Yezu2iNJ!_=neUA{)
zHv1m^j2Y@z9$()tmh4*E@d`$!niVtN*I!CT)ZQ+Cx7c@s2okR>mo0U@pN0sQ0fQbx
zO}4W&%7}I4dGo9;ZBK8eXLV`ys@$9mQnOXAtEeSk6YGS9SxF)5&l6V9-0;)^Z!OsA
z%!7mF%&IPA*&VH_Yu0p(^^{e)+Xu8;*TANDR$TeI@R+KgGx_S9VCOOS&-GFVh&NU)
z@t&~fY&5?F*>m!C?b~Bo((8}Cn%6{<Tc(_SeHvz>vd)tSI2v-6$aj9fv{GC7$Q-o%
zif&u>ogv@TQ#Ri<t=yQX4%yMVm=mRHhdp&{X!dK~^2X~O><%!}N3Zi6#B>>GPib)h
zHb?k9@Hb@5*LKr}R!5^9tBb(ukakLP9#&t+%F`Npz|7xDjV5LciPdDs>J9UChO>zO
zY!cpqIpyP^zW>ht*#0ARtjYU59+dNrvhIktWB#t_qhp6X9#3gsy649f`gkg)axHr}
FqCcd3!g>Gz
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4cfd32c54b7f216718ef1a97d69bd92a2a92a143
GIT binary patch
literal 156
zc%1w9pFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml<
f14T-JtRkSSH3JtGQ(PD_fjSC+>_mo2a?At(uMryf
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f7d1251668bb433b683da995409eacb54d5fc0be
GIT binary patch
literal 2588
zc%0=`+iKfD5S{0Kg)t4Zf!ef>4S`+~2sCL-O+G-DW!cpg-9rAi{)IlaJ#%(ttyS5E
z(6=Ha@2+OfnK?5f|Nb?Va~a88Dk)?msf1Euzmg35kvw1*aP<`@6)aY`eet-?U_Zih
zg{OzxhouLPHP+`cl@~I0&aU9$Neuf?Zh-2^lGtNdU*aCi3_E?R9to}hEF(FS4|uL|
zR*<ccAK<MRgYq^&kEOOJrA&ZyafJI0C!xc7WqH=XEgYr|Spuwb*@8u5jVx;^Pq_7M
z8)X3W*lLx+-ejTirO4B)^S%5gIJu^Ry3cW`=9LpcNxt0XrTYwiBjD9|M#MH&T9b$z
zS{IF^)omp|iKQ3@`#bWCiRxN+?>Ag^@h+H`$+Oi~)lKp4^FOL?0mUNgGh!{f$O9YM
ziW+y-J<R|ARQRpDd{&i>{Q@=>C*LF5JEC1UHTD^gDv&b5zOpwv9-YjRIfPU>wb~fI
z7<?s9mc3g1-D8Rnu)2wZu)vw>pkJwmNDcd?)ha|Js;=oEt!!%5%Ln@|vYq3z7V6b?
zmPX=Hvwpt!PIWwfElocx$*4W@hE*;(LE068Ri&+E154dy_8S)2SyP0NDkeKC&3O&w
z8q1RG*aCXR$l07kyRY}DsqI&E20IU@%9LT<pW0~8-eX3}_zFE_YGHayqp#%kfQF|S
zhH$!gJDgkmE;xmq@AUz_-|ynccOBznqK7c%*hloNtar{hH}vQtDXGCyzTvl><WKxo
zRjj6q=+3L#Y5U)S?te;q!)IK>h#!%`0zOZUmrlss#x(48FJBJmFmp0|Kt{KY*P2K<
zG@Rmk<TXK6GEPy<NikhC?V-B5O^B0FX}9-k_R$inN36_zX%;?XU)qkWsgzr#GtPR+
zTGg~PeYj=S3U<I2zwW>PX|}nYnwmXY9OXOAb&Tzf47Kg8W4R@c<?}LgxlU!)u^nRi
E1N;5XcmMzZ
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..088fb4f6cd3ed0b07763ca02b8c608f97ddfff67
GIT binary patch
literal 168
zc%1w9pFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|Opu@b{^hHnhnU@--t%1ofD
h6d+jy#K}Nh48%$d)(l)&%yI$C7XaCb43*@Y3;?#LA2I*{
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a82f990edcd36c5bd6abc8c76abbf399717a0dc7
GIT binary patch
literal 2430
zc$~FX+iKfD5FNetCoD`&A+&bg$Cg6rh4jHGA#R?HBFVOpWE)FLuzxsz(5KS$%-NN+
zaeX1sU?lCXX3m^BGrRJ`pMji-FJmcXEr~2-CI#kGSz_+XHD)nKKd@55Vu~x2fa4|X
zecY$G2e?952Jo0;d?o{VAzf$fD?9?pU_X=ZKn)}!b{Ezkado99pYW_?1B(ilf#mcZ
zdcNGiHpN<um^tnd&{9}WJY7%lM$vqX16ko(U_SKvK>cup#|2hq4udh?704|{3}0@E
zsF6CJQDK*xK6O2Yk742R>r+`(vchUbwMududO3X;xNhjDJ_ReFF*n4GXcsd7C2frF
z78Z%z)7qzM#%m_On0L%t8cfybw`{qlHX2PCuc?!%vSL?Ivc!GO>>}K2?Nq%5Y`*-r
zN*V@pc2NMEjNOwm=ZQD;bgpdN`W<HQ{59;!J9&wWUNu!rfMG0^XX5C6s)la87Z~l<
za>z)}UC$6Ux#duT^R9*?#3-?^W3svjkJKt+R+LxB_)FWzMn%msfc?-*xneX3$hvTL
zg2CJpGp7oN6;qG44`S9#)!60yP2Ny}f?egaE7wg$G)7|e%2?U8Q-jx3+i05dZ0mT5
z)!rw<mM9tLrt)evfmP1lt(a$9+q{WbV7=qjYJ^ndSS>E8oT@u#{=0jt?r!a8&Bvgt
zS{tiyzDKQ7sCv$87v}O9wdL7jjhJbS(INHUHw;$n-CM@q?DagSQW=rWnSM!z2^CK5
zxzX|{s8l3Zc$$tc<ukG_@zXC-i+t7W3GKLZXE(K9g}`=lb^zn8w_--wqmyWCIqdiO
zX-}5?fC_bfI=%+Wk>fij-U<p1@Vn!$kKSDJtkb^h+m0FRpspO$K5_Dfb=_wbdo04}
z4kNRJG?$PWM7H}(FS|AB;hpK^1<$_vOPl@kl|3C}Z2xCe_RM%{lw)x&h+T1i9M2`<
RJ~aLHv|QX6r*b(S<u3?jsXYJy
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.m
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.m
@@ -26,16 +26,17 @@
 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #import <Breakpad/Breakpad.h>
 
 #import "Controller.h"
 #import "TestClass.h"
+#import "GTMDefines.h"
 #include <unistd.h>
 #include <mach/mach.h>
 
 @implementation Controller
 
 - (void)causeCrash {
   float *aPtr = nil;
   NSLog(@"Crash!");
@@ -46,17 +47,17 @@
   BreakpadGenerateAndSendReport(breakpad_);
 }
 
 - (IBAction)showForkTestWindow:(id) sender {
   [forkTestOptions_ setIsVisible:YES];
 }
 
 - (IBAction)forkTestOptions:(id)sender {
-  int tag = [[sender selectedCell] tag];
+  NSInteger tag = [[sender selectedCell] tag];
   NSLog(@"sender tag: %d", tag);
   if (tag <= 2) {
     bpForkOption = tag;
   }
 
   if (tag == 3) {
     useVFork = NO;
   }
@@ -70,17 +71,17 @@
   }
 
 }
 
 - (IBAction)forkTestGo:(id)sender {
 
   NSString *resourcePath = [[NSBundle bundleForClass:
                                         [self class]] resourcePath];
-  NSString *execProgname;
+  NSString *execProgname = nil;
   if (progCrashPoint == DURINGLAUNCH) {
     execProgname = [resourcePath stringByAppendingString:@"/crashduringload"];
   } else if (progCrashPoint == AFTERLAUNCH) {
     execProgname = [resourcePath stringByAppendingString:@"/crashInMain"];
   }
 
   const char *progName = NULL;
   if (progCrashPoint != BETWEENFORKEXEC) {
@@ -124,21 +125,21 @@
     fclose(fd);
     int i = execl(progName, progName, NULL);
     fprintf(fd, "exec returned! %d\n", i);
     fclose(fd);
   }
 }
 
 - (IBAction)crash:(id)sender {
-  int tag = [sender tag];
+  NSInteger tag = [sender tag];
 
   if (tag == 1) {
     [NSObject cancelPreviousPerformRequestsWithTarget:self];
-    [self performSelector:@selector(causeCrash) withObject:nil afterDelay:10];
+    [self performSelector:@selector(causeCrash) withObject:nil afterDelay:10.0];
     [sender setState:NSOnState];
     return;
   }
 
   if (tag == 2 && breakpad_) {
     BreakpadRelease(breakpad_);
     breakpad_ = NULL;
     return;
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.xib
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.xib
@@ -1,36 +1,37 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
 		<string key="IBDocument.SystemVersion">10F569</string>
-		<string key="IBDocument.InterfaceBuilderVersion">762</string>
+		<string key="IBDocument.InterfaceBuilderVersion">788</string>
 		<string key="IBDocument.AppKitVersion">1038.29</string>
 		<string key="IBDocument.HIToolboxVersion">461.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">788</string>
+		</object>
+		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+			<bool key="EncodedWithXMLCoder">YES</bool>
+			<integer value="220"/>
+		</object>
+		<object class="NSArray" key="IBDocument.PluginDependencies">
+			<bool key="EncodedWithXMLCoder">YES</bool>
+			<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+		</object>
+		<object class="NSMutableDictionary" key="IBDocument.Metadata">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 			<object class="NSMutableArray" key="dict.values">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
 		</object>
-		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
-			<bool key="EncodedWithXMLCoder">YES</bool>
-		</object>
-		<reference key="IBDocument.PluginDependencies" ref="0"/>
-		<object class="NSMutableDictionary" key="IBDocument.Metadata">
-			<bool key="EncodedWithXMLCoder">YES</bool>
-			<reference key="dict.sortedKeys" ref="0"/>
-			<object class="NSMutableArray" key="dict.values">
-				<bool key="EncodedWithXMLCoder">YES</bool>
-			</object>
-		</object>
 		<object class="NSMutableArray" key="IBDocument.RootObjects" id="925601844">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 			<object class="NSCustomObject" id="870565383">
 				<object class="NSMutableString" key="NSClassName">
 					<characters key="NS.bytes">NSApplication</characters>
 				</object>
 			</object>
 			<object class="NSCustomObject" id="442653439">
@@ -47,25 +48,26 @@
 				<string key="NSWindowTitle">Window</string>
 				<string key="NSWindowClass">NSWindow</string>
 				<object class="NSMutableString" key="NSViewClass">
 					<characters key="NS.bytes">View</characters>
 				</object>
 				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<string key="NSWindowContentMinSize">{213, 107}</string>
 				<object class="NSView" key="NSWindowView" id="814272478">
-					<nil key="NSNextResponder"/>
+					<reference key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
 					<object class="NSMutableArray" key="NSSubviews">
 						<bool key="EncodedWithXMLCoder">YES</bool>
 						<object class="NSButton" id="726278107">
 							<reference key="NSNextResponder" ref="814272478"/>
 							<int key="NSvFlags">301</int>
 							<string key="NSFrame">{{14, 140}, {292, 32}}</string>
 							<reference key="NSSuperview" ref="814272478"/>
+							<reference key="NSWindow"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="539552922">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">134217728</int>
 								<string key="NSContents">Crash! (Airbag Installed)</string>
 								<object class="NSFont" key="NSSupport" id="933596199">
 									<string key="NSName">LucidaGrande</string>
 									<double key="NSSize">13</double>
@@ -83,16 +85,17 @@
 								<int key="NSPeriodicInterval">25</int>
 							</object>
 						</object>
 						<object class="NSButton" id="799567279">
 							<reference key="NSNextResponder" ref="814272478"/>
 							<int key="NSvFlags">301</int>
 							<string key="NSFrame">{{14, 76}, {292, 32}}</string>
 							<reference key="NSSuperview" ref="814272478"/>
+							<reference key="NSWindow"/>
 							<int key="NSTag">2</int>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="1010617379">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">134217728</int>
 								<string key="NSContents">Crash! (Airbag NOT Installed)</string>
 								<reference key="NSSupport" ref="933596199"/>
 								<reference key="NSControlView" ref="799567279"/>
@@ -108,16 +111,17 @@
 								<int key="NSPeriodicInterval">25</int>
 							</object>
 						</object>
 						<object class="NSButton" id="27781390">
 							<reference key="NSNextResponder" ref="814272478"/>
 							<int key="NSvFlags">301</int>
 							<string key="NSFrame">{{14, 108}, {292, 32}}</string>
 							<reference key="NSSuperview" ref="814272478"/>
+							<reference key="NSWindow"/>
 							<int key="NSTag">1</int>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="547901497">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">134217728</int>
 								<string key="NSContents">Crash! (Airbag Installed w/10sec delay)</string>
 								<reference key="NSSupport" ref="933596199"/>
 								<reference key="NSControlView" ref="27781390"/>
@@ -133,16 +137,17 @@
 								<int key="NSPeriodicInterval">25</int>
 							</object>
 						</object>
 						<object class="NSButton" id="856256540">
 							<reference key="NSNextResponder" ref="814272478"/>
 							<int key="NSvFlags">268</int>
 							<string key="NSFrame">{{14, 44}, {292, 32}}</string>
 							<reference key="NSSuperview" ref="814272478"/>
+							<reference key="NSWindow"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="353736234">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">134217728</int>
 								<string key="NSContents">Fork Test</string>
 								<reference key="NSSupport" ref="933596199"/>
 								<reference key="NSControlView" ref="856256540"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -153,16 +158,17 @@
 								<int key="NSPeriodicInterval">25</int>
 							</object>
 						</object>
 						<object class="NSButton" id="460755987">
 							<reference key="NSNextResponder" ref="814272478"/>
 							<int key="NSvFlags">268</int>
 							<string key="NSFrame">{{14, 12}, {292, 32}}</string>
 							<reference key="NSSuperview" ref="814272478"/>
+							<reference key="NSWindow"/>
 							<bool key="NSEnabled">YES</bool>
 							<object class="NSButtonCell" key="NSCell" id="775425649">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">134217728</int>
 								<string key="NSContents">Generate report without crash</string>
 								<reference key="NSSupport" ref="933596199"/>
 								<reference key="NSControlView" ref="460755987"/>
 								<int key="NSButtonFlags">-2038284033</int>
@@ -170,16 +176,18 @@
 								<string key="NSAlternateContents"/>
 								<string key="NSKeyEquivalent"/>
 								<int key="NSPeriodicDelay">200</int>
 								<int key="NSPeriodicInterval">25</int>
 							</object>
 						</object>
 					</object>
 					<string key="NSFrameSize">{320, 188}</string>
+					<reference key="NSSuperview"/>
+					<reference key="NSWindow"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMinSize">{213, 129}</string>
 				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 			</object>
 			<object class="NSMenu" id="695387251">
 				<string key="NSTitle">MainMenu</string>
 				<object class="NSMutableArray" key="NSMenuItems">
@@ -777,17 +785,17 @@
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{858, 755}, {787, 260}}</string>
 				<int key="NSWTFlags">603979776</int>
 				<string key="NSWindowTitle">Window</string>
 				<string key="NSWindowClass">NSWindow</string>
 				<nil key="NSViewClass"/>
 				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<object class="NSView" key="NSWindowView" id="594333702">
-					<nil key="NSNextResponder"/>
+					<reference key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
 					<object class="NSMutableArray" key="NSSubviews">
 						<bool key="EncodedWithXMLCoder">YES</bool>
 						<object class="NSMatrix" id="891367997">
 							<reference key="NSNextResponder" ref="594333702"/>
 							<int key="NSvFlags">268</int>
 							<string key="NSFrame">{{20, 7}, {645, 79}}</string>
 							<reference key="NSSuperview" ref="594333702"/>
@@ -799,34 +807,34 @@
 								<object class="NSButtonCell" id="410017819">
 									<int key="NSCellFlags">-2080244224</int>
 									<int key="NSCellFlags2">0</int>
 									<string key="NSContents">program crashes during launch because of missing dylib</string>
 									<reference key="NSSupport" ref="933596199"/>
 									<reference key="NSControlView" ref="891367997"/>
 									<int key="NSTag">5</int>
 									<int key="NSButtonFlags">1211912703</int>
-									<int key="NSButtonFlags2">128</int>
+									<int key="NSButtonFlags2">0</int>
 									<object class="NSButtonImageSource" key="NSAlternateImage" id="619763889">
 										<string key="NSImageName">NSRadioButton</string>
 									</object>
 									<string key="NSAlternateContents"/>
 									<string key="NSKeyEquivalent"/>
 									<int key="NSPeriodicDelay">200</int>
 									<int key="NSPeriodicInterval">25</int>
 								</object>
 								<object class="NSButtonCell" id="904578786">
 									<int key="NSCellFlags">67239424</int>
 									<int key="NSCellFlags2">0</int>
 									<string key="NSContents">program crashes after launch</string>
 									<reference key="NSSupport" ref="933596199"/>
 									<reference key="NSControlView" ref="891367997"/>
 									<int key="NSTag">6</int>
 									<int key="NSButtonFlags">1211912703</int>
-									<int key="NSButtonFlags2">128</int>
+									<int key="NSButtonFlags2">0</int>
 									<object class="NSImage" key="NSNormalImage">
 										<int key="NSImageFlags">549453824</int>
 										<string key="NSSize">{18, 18}</string>
 										<object class="NSMutableArray" key="NSReps">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 											<object class="NSArray">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<integer value="0"/>
@@ -925,17 +933,17 @@ QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAA
 								<object class="NSButtonCell" id="971445237">
 									<int key="NSCellFlags">67239424</int>
 									<int key="NSCellFlags2">0</int>
 									<string key="NSContents">program crashes in between fork() and exec() (3rd option in first group will happen before crash)</string>
 									<reference key="NSSupport" ref="933596199"/>
 									<reference key="NSControlView" ref="891367997"/>
 									<int key="NSTag">7</int>
 									<int key="NSButtonFlags">1211912703</int>
-									<int key="NSButtonFlags2">128</int>
+									<int key="NSButtonFlags2">0</int>
 									<object class="NSImage" key="NSNormalImage">
 										<int key="NSImageFlags">549453824</int>
 										<string key="NSSize">{18, 18}</string>
 										<object class="NSMutableArray" key="NSReps">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 											<object class="NSArray">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<integer value="0"/>
@@ -1035,17 +1043,17 @@ AAAAAAAAAAAAAAAAAABtbW9kAAAAAAAAIvAAACaQ
 							<string key="NSCellClass">NSActionCell</string>
 							<object class="NSButtonCell" key="NSProtoCell" id="1072218638">
 								<int key="NSCellFlags">-2080244224</int>
 								<int key="NSCellFlags2">0</int>
 								<string key="NSContents">program crashes after launch</string>
 								<reference key="NSSupport" ref="933596199"/>
 								<int key="NSTag">5</int>
 								<int key="NSButtonFlags">1211912703</int>
-								<int key="NSButtonFlags2">128</int>
+								<int key="NSButtonFlags2">0</int>
 								<reference key="NSAlternateImage" ref="619763889"/>
 								<string key="NSAlternateContents"/>
 								<string key="NSKeyEquivalent"/>
 								<int key="NSPeriodicDelay">200</int>
 								<int key="NSPeriodicInterval">25</int>
 							</object>
 							<reference key="NSSelectedCell" ref="410017819"/>
 							<object class="NSColor" key="NSBackgroundColor" id="349124561">
@@ -1075,32 +1083,32 @@ AAAAAAAAAAAAAAAAAABtbW9kAAAAAAAAIvAAACaQ
 								<bool key="EncodedWithXMLCoder">YES</bool>
 								<object class="NSButtonCell" id="808388382">
 									<int key="NSCellFlags">-2080244224</int>
 									<int key="NSCellFlags2">0</int>
 									<string key="NSContents">Leave breakpad alone before fork</string>
 									<reference key="NSSupport" ref="933596199"/>
 									<reference key="NSControlView" ref="7590393"/>
 									<int key="NSButtonFlags">1211912703</int>
-									<int key="NSButtonFlags2">128</int>
+									<int key="NSButtonFlags2">0</int>
 									<reference key="NSAlternateImage" ref="619763889"/>
 									<string key="NSAlternateContents"/>
 									<string key="NSKeyEquivalent"/>
 									<int key="NSPeriodicDelay">200</int>
 									<int key="NSPeriodicInterval">25</int>
 								</object>
 								<object class="NSButtonCell" id="378736460">
 									<int key="NSCellFlags">67239424</int>
 									<int key="NSCellFlags2">0</int>
 									<string key="NSContents">Uninitialize Breakpad before fork</string>
 									<reference key="NSSupport" ref="933596199"/>
 									<reference key="NSControlView" ref="7590393"/>
 									<int key="NSTag">1</int>
 									<int key="NSButtonFlags">1211912703</int>
-									<int key="NSButtonFlags2">128</int>
+									<int key="NSButtonFlags2">0</int>
 									<object class="NSImage" key="NSNormalImage">
 										<int key="NSImageFlags">549453824</int>
 										<string key="NSSize">{18, 18}</string>
 										<object class="NSMutableArray" key="NSReps">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 											<object class="NSArray">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<integer value="0"/>
@@ -1196,17 +1204,17 @@ QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAA
 								<object class="NSButtonCell" id="251439646">
 									<int key="NSCellFlags">67239424</int>
 									<int key="NSCellFlags2">0</int>
 									<string key="NSContents">Call task_set_exception_port with null exception port in child process before exec</string>
 									<reference key="NSSupport" ref="933596199"/>
 									<reference key="NSControlView" ref="7590393"/>
 									<int key="NSTag">2</int>
 									<int key="NSButtonFlags">1211912703</int>
-									<int key="NSButtonFlags2">128</int>
+									<int key="NSButtonFlags2">0</int>
 									<object class="NSImage" key="NSNormalImage">
 										<int key="NSImageFlags">549453824</int>
 										<string key="NSSize">{18, 18}</string>
 										<object class="NSMutableArray" key="NSReps">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 											<object class="NSArray">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<integer value="0"/>
@@ -1304,17 +1312,17 @@ AAAAAAAAAAAAAAAAAABtbW9kAAAAAAAAIvAAACaQ
 							<int key="NSMatrixFlags">1151868928</int>
 							<string key="NSCellClass">NSActionCell</string>
 							<object class="NSButtonCell" key="NSProtoCell" id="773902463">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">0</int>
 								<string key="NSContents">Radio</string>
 								<reference key="NSSupport" ref="933596199"/>
 								<int key="NSButtonFlags">1211912703</int>
-								<int key="NSButtonFlags2">128</int>
+								<int key="NSButtonFlags2">0</int>
 								<object class="NSImage" key="NSNormalImage">
 									<int key="NSImageFlags">549453824</int>
 									<string key="NSSize">{18, 18}</string>
 									<object class="NSMutableArray" key="NSReps">
 										<bool key="EncodedWithXMLCoder">YES</bool>
 										<object class="NSArray">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 											<integer value="0"/>
@@ -1373,32 +1381,32 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAI
 								<object class="NSButtonCell" id="943458284">
 									<int key="NSCellFlags">-2080244224</int>
 									<int key="NSCellFlags2">0</int>
 									<string key="NSContents">fork()</string>
 									<reference key="NSSupport" ref="933596199"/>
 									<reference key="NSControlView" ref="1050951576"/>
 									<int key="NSTag">3</int>
 									<int key="NSButtonFlags">1211912703</int>
-									<int key="NSButtonFlags2">128</int>
+									<int key="NSButtonFlags2">0</int>
 									<reference key="NSAlternateImage" ref="619763889"/>
 									<string key="NSAlternateContents"/>
 									<string key="NSKeyEquivalent"/>
 									<int key="NSPeriodicDelay">200</int>
 									<int key="NSPeriodicInterval">25</int>
 								</object>
 								<object class="NSButtonCell" id="69061500">
 									<int key="NSCellFlags">67239424</int>
 									<int key="NSCellFlags2">0</int>
 									<string key="NSContents">vfork()</string>
 									<reference key="NSSupport" ref="933596199"/>
 									<reference key="NSControlView" ref="1050951576"/>
 									<int key="NSTag">4</int>
 									<int key="NSButtonFlags">1211912703</int>
-									<int key="NSButtonFlags2">128</int>
+									<int key="NSButtonFlags2">0</int>
 									<object class="NSImage" key="NSNormalImage">
 										<int key="NSImageFlags">549453824</int>
 										<string key="NSSize">{18, 18}</string>
 										<object class="NSMutableArray" key="NSReps">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 											<object class="NSArray">
 												<bool key="EncodedWithXMLCoder">YES</bool>
 												<integer value="0"/>
@@ -1497,17 +1505,17 @@ QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAA
 							<int key="NSMatrixFlags">1151868928</int>
 							<string key="NSCellClass">NSActionCell</string>
 							<object class="NSButtonCell" key="NSProtoCell" id="709643899">
 								<int key="NSCellFlags">67239424</int>
 								<int key="NSCellFlags2">0</int>
 								<string key="NSContents">Radio</string>
 								<reference key="NSSupport" ref="933596199"/>
 								<int key="NSButtonFlags">1211912703</int>
-								<int key="NSButtonFlags2">128</int>
+								<int key="NSButtonFlags2">0</int>
 								<object class="NSImage" key="NSNormalImage">
 									<int key="NSImageFlags">549453824</int>
 									<string key="NSSize">{18, 18}</string>
 									<object class="NSMutableArray" key="NSReps">
 										<bool key="EncodedWithXMLCoder">YES</bool>
 										<object class="NSArray">
 											<bool key="EncodedWithXMLCoder">YES</bool>
 											<integer value="0"/>
@@ -1574,16 +1582,17 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAI
 								<string key="NSAlternateContents"/>
 								<string key="NSKeyEquivalent"/>
 								<int key="NSPeriodicDelay">400</int>
 								<int key="NSPeriodicInterval">75</int>
 							</object>
 						</object>
 					</object>
 					<string key="NSFrameSize">{787, 260}</string>
+					<reference key="NSSuperview"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
 				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
 			</object>
 		</object>
 		<object class="IBObjectContainer" key="IBDocument.Objects">
 			<object class="NSMutableArray" key="connectionRecords">
 				<bool key="EncodedWithXMLCoder">YES</bool>
@@ -2609,204 +2618,392 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAI
 						<reference key="parent" ref="1050951576"/>
 					</object>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<object class="NSArray" key="dict.sortedKeys">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>-3.IBPluginDependency</string>
 					<string>-3.ImportedFromIB2</string>
+					<string>103.IBPluginDependency</string>
 					<string>103.ImportedFromIB2</string>
+					<string>106.IBPluginDependency</string>
 					<string>106.ImportedFromIB2</string>
+					<string>111.IBPluginDependency</string>
 					<string>111.ImportedFromIB2</string>
+					<string>112.IBPluginDependency</string>
 					<string>112.ImportedFromIB2</string>
+					<string>124.IBPluginDependency</string>
 					<string>124.ImportedFromIB2</string>
+					<string>125.IBPluginDependency</string>
 					<string>125.ImportedFromIB2</string>
+					<string>126.IBPluginDependency</string>
 					<string>126.ImportedFromIB2</string>
+					<string>129.IBPluginDependency</string>
 					<string>129.ImportedFromIB2</string>
+					<string>130.IBPluginDependency</string>
 					<string>130.ImportedFromIB2</string>
+					<string>131.IBPluginDependency</string>
 					<string>131.ImportedFromIB2</string>
+					<string>134.IBPluginDependency</string>
 					<string>134.ImportedFromIB2</string>
+					<string>136.IBPluginDependency</string>
 					<string>136.ImportedFromIB2</string>
+					<string>143.IBPluginDependency</string>
 					<string>143.ImportedFromIB2</string>
+					<string>144.IBPluginDependency</string>
 					<string>144.ImportedFromIB2</string>
+					<string>145.IBPluginDependency</string>
 					<string>145.ImportedFromIB2</string>
+					<string>149.IBPluginDependency</string>
 					<string>149.ImportedFromIB2</string>
+					<string>150.IBPluginDependency</string>
 					<string>150.ImportedFromIB2</string>
+					<string>154.IBPluginDependency</string>
 					<string>154.ImportedFromIB2</string>
+					<string>155.IBPluginDependency</string>
 					<string>155.ImportedFromIB2</string>
+					<string>156.IBPluginDependency</string>
 					<string>156.ImportedFromIB2</string>
+					<string>157.IBPluginDependency</string>
 					<string>157.ImportedFromIB2</string>
+					<string>158.IBPluginDependency</string>
 					<string>158.ImportedFromIB2</string>
+					<string>159.IBPluginDependency</string>
 					<string>159.ImportedFromIB2</string>
+					<string>160.IBPluginDependency</string>
 					<string>160.ImportedFromIB2</string>
+					<string>161.IBPluginDependency</string>
 					<string>161.ImportedFromIB2</string>
+					<string>162.IBPluginDependency</string>
 					<string>162.ImportedFromIB2</string>
+					<string>163.IBPluginDependency</string>
 					<string>163.ImportedFromIB2</string>
+					<string>164.IBPluginDependency</string>
 					<string>164.ImportedFromIB2</string>
+					<string>167.IBPluginDependency</string>
 					<string>167.ImportedFromIB2</string>
+					<string>168.IBPluginDependency</string>
 					<string>168.ImportedFromIB2</string>
+					<string>169.IBPluginDependency</string>
 					<string>169.ImportedFromIB2</string>
+					<string>171.IBPluginDependency</string>
 					<string>171.ImportedFromIB2</string>
+					<string>172.IBPluginDependency</string>
 					<string>172.ImportedFromIB2</string>
+					<string>173.IBPluginDependency</string>
 					<string>173.ImportedFromIB2</string>
+					<string>174.IBPluginDependency</string>
 					<string>174.ImportedFromIB2</string>
+					<string>184.IBPluginDependency</string>
 					<string>184.ImportedFromIB2</string>
+					<string>185.IBPluginDependency</string>
 					<string>185.ImportedFromIB2</string>
+					<string>187.IBPluginDependency</string>
 					<string>187.ImportedFromIB2</string>
+					<string>189.IBPluginDependency</string>
 					<string>189.ImportedFromIB2</string>
+					<string>19.IBPluginDependency</string>
 					<string>19.ImportedFromIB2</string>
+					<string>191.IBPluginDependency</string>
 					<string>191.ImportedFromIB2</string>
+					<string>196.IBPluginDependency</string>
 					<string>196.ImportedFromIB2</string>
+					<string>197.IBPluginDependency</string>
 					<string>197.ImportedFromIB2</string>
+					<string>2.IBPluginDependency</string>
 					<string>2.ImportedFromIB2</string>
+					<string>204.IBPluginDependency</string>
 					<string>204.ImportedFromIB2</string>
+					<string>206.IBPluginDependency</string>
 					<string>206.ImportedFromIB2</string>
 					<string>207.ImportedFromIB2</string>
 					<string>21.IBEditorWindowLastContentRect</string>
+					<string>21.IBPluginDependency</string>
 					<string>21.IBWindowTemplateEditedContentRect</string>
 					<string>21.ImportedFromIB2</string>
 					<string>21.windowTemplate.hasMinSize</string>
 					<string>21.windowTemplate.minSize</string>
+					<string>210.IBPluginDependency</string>
 					<string>210.ImportedFromIB2</string>
+					<string>212.IBPluginDependency</string>
 					<string>212.ImportedFromIB2</string>
+					<string>218.IBPluginDependency</string>
 					<string>218.ImportedFromIB2</string>
 					<string>220.IBEditorWindowLastContentRect</string>
+					<string>220.IBPluginDependency</string>
 					<string>220.IBWindowTemplateEditedContentRect</string>
 					<string>220.ImportedFromIB2</string>
+					<string>221.IBPluginDependency</string>
 					<string>221.ImportedFromIB2</string>
+					<string>226.IBPluginDependency</string>
 					<string>226.ImportedFromIB2</string>
+					<string>227.IBPluginDependency</string>
 					<string>227.ImportedFromIB2</string>
+					<string>228.IBPluginDependency</string>
 					<string>228.ImportedFromIB2</string>
+					<string>23.IBPluginDependency</string>
 					<string>23.ImportedFromIB2</string>
+					<string>232.IBPluginDependency</string>
 					<string>232.ImportedFromIB2</string>
+					<string>233.IBPluginDependency</string>
 					<string>233.ImportedFromIB2</string>
+					<string>234.IBPluginDependency</string>
 					<string>234.ImportedFromIB2</string>
+					<string>236.IBPluginDependency</string>
 					<string>236.ImportedFromIB2</string>
+					<string>237.IBPluginDependency</string>
 					<string>237.ImportedFromIB2</string>
+					<string>238.IBPluginDependency</string>
 					<string>238.ImportedFromIB2</string>
+					<string>239.IBPluginDependency</string>
 					<string>239.ImportedFromIB2</string>
+					<string>24.IBPluginDependency</string>
 					<string>24.ImportedFromIB2</string>
+					<string>248.IBPluginDependency</string>
 					<string>248.ImportedFromIB2</string>
+					<string>272.IBPluginDependency</string>
 					<string>272.ImportedFromIB2</string>
 					<string>29.IBEditorWindowLastContentRect</string>
+					<string>29.IBPluginDependency</string>
 					<string>29.ImportedFromIB2</string>
+					<string>325.IBPluginDependency</string>
 					<string>325.ImportedFromIB2</string>
+					<string>329.IBPluginDependency</string>
+					<string>330.IBPluginDependency</string>
+					<string>331.IBPluginDependency</string>
+					<string>332.IBPluginDependency</string>
+					<string>333.IBPluginDependency</string>
+					<string>334.IBPluginDependency</string>
+					<string>335.IBPluginDependency</string>
+					<string>336.IBPluginDependency</string>
+					<string>337.IBPluginDependency</string>
+					<string>5.IBPluginDependency</string>
 					<string>5.ImportedFromIB2</string>
+					<string>56.IBPluginDependency</string>
 					<string>56.ImportedFromIB2</string>
+					<string>57.IBPluginDependency</string>
 					<string>57.ImportedFromIB2</string>
+					<string>58.IBPluginDependency</string>
 					<string>58.ImportedFromIB2</string>
+					<string>72.IBPluginDependency</string>
 					<string>72.ImportedFromIB2</string>
+					<string>73.IBPluginDependency</string>
 					<string>73.ImportedFromIB2</string>
+					<string>74.IBPluginDependency</string>
 					<string>74.ImportedFromIB2</string>
+					<string>75.IBPluginDependency</string>
 					<string>75.ImportedFromIB2</string>
+					<string>77.IBPluginDependency</string>
 					<string>77.ImportedFromIB2</string>
+					<string>78.IBPluginDependency</string>
 					<string>78.ImportedFromIB2</string>
+					<string>79.IBPluginDependency</string>
 					<string>79.ImportedFromIB2</string>
+					<string>80.IBPluginDependency</string>
 					<string>80.ImportedFromIB2</string>
+					<string>81.IBPluginDependency</string>
 					<string>81.ImportedFromIB2</string>
+					<string>82.IBPluginDependency</string>
 					<string>82.ImportedFromIB2</string>
+					<string>83.IBPluginDependency</string>
 					<string>83.ImportedFromIB2</string>
+					<string>92.IBPluginDependency</string>
 					<string>92.ImportedFromIB2</string>
 				</object>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
 					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<boolean value="YES"/>
-					<string>{{42, 911}, {320, 188}}</string>
-					<string>{{42, 911}, {320, 188}}</string>
+					<string>{{510, 1250}, {320, 188}}</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>{{510, 1250}, {320, 188}}</string>
 					<boolean value="YES"/>
 					<boolean value="YES"/>
 					<string>{213, 107}</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>{{-55, 1287}, {787, 260}}</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>{{-55, 1287}, {787, 260}}</string>
 					<boolean value="YES"/>
-					<string>{{21, 862}, {787, 260}}</string>
-					<string>{{21, 862}, {787, 260}}</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
-					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
-					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
 					<string>{{0, 1114}, {362, 20}}</string>
-					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
-					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
-					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<boolean value="YES"/>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<reference key="dict.sortedKeys" ref="0"/>
 				<object class="NSMutableArray" key="dict.values">
 					<bool key="EncodedWithXMLCoder">YES</bool>
@@ -2843,56 +3040,701 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAI
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<string>id</string>
 							<string>id</string>
 							<string>id</string>
 							<string>id</string>
 							<string>id</string>
 						</object>
 					</object>
+					<object class="NSMutableDictionary" key="actionInfosByName">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>crash:</string>
+							<string>forkTestGo:</string>
+							<string>forkTestOptions:</string>
+							<string>generateReportWithoutCrash:</string>
+							<string>showForkTestWindow:</string>
+						</object>
+						<object class="NSMutableArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<object class="IBActionInfo">
+								<string key="name">crash:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">forkTestGo:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">forkTestOptions:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">generateReportWithoutCrash:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">showForkTestWindow:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+						</object>
+					</object>
 					<object class="NSMutableDictionary" key="outlets">
 						<bool key="EncodedWithXMLCoder">YES</bool>
 						<object class="NSArray" key="dict.sortedKeys">
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<string>forkTestOptions_</string>
 							<string>window_</string>
 						</object>
 						<object class="NSMutableArray" key="dict.values">
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<string>NSWindow</string>
 							<string>NSWindow</string>
 						</object>
 					</object>
+					<object class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>forkTestOptions_</string>
+							<string>window_</string>
+						</object>
+						<object class="NSMutableArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<object class="IBToOneOutletInfo">
+								<string key="name">forkTestOptions_</string>
+								<string key="candidateClassName">NSWindow</string>
+							</object>
+							<object class="IBToOneOutletInfo">
+								<string key="name">window_</string>
+								<string key="candidateClassName">NSWindow</string>
+							</object>
+						</object>
+					</object>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">testapp/Controller.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">Controller</string>
+					<string key="superclassName">NSObject</string>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 						<string key="majorKey">IBUserSource</string>
 						<string key="minorKey"/>
 					</object>
 				</object>
 				<object class="IBPartialClassDescription">
 					<string key="className">FirstResponder</string>
 					<string key="superclassName">NSObject</string>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 						<string key="majorKey">IBUserSource</string>
 						<string key="minorKey"/>
 					</object>
 				</object>
 			</object>
+			<object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+				<bool key="EncodedWithXMLCoder">YES</bool>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSActionCell</string>
+					<string key="superclassName">NSCell</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSApplication</string>
+					<string key="superclassName">NSResponder</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="785325875">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSApplication.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSApplication</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="806686590">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSApplication</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="301712406">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSApplication</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSApplication</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSApplication</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSBrowser</string>
+					<string key="superclassName">NSControl</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSBrowser.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSButton</string>
+					<string key="superclassName">NSControl</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSButton.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSButtonCell</string>
+					<string key="superclassName">NSActionCell</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSButtonCell.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSCell</string>
+					<string key="superclassName">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSCell.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSControl</string>
+					<string key="superclassName">NSView</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="787388657">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSControl.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSDocument</string>
+					<string key="superclassName">NSObject</string>
+					<object class="NSMutableDictionary" key="actions">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>printDocument:</string>
+							<string>revertDocumentToSaved:</string>
+							<string>runPageLayout:</string>
+							<string>saveDocument:</string>
+							<string>saveDocumentAs:</string>
+							<string>saveDocumentTo:</string>
+						</object>
+						<object class="NSMutableArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+						</object>
+					</object>
+					<object class="NSMutableDictionary" key="actionInfosByName">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>printDocument:</string>
+							<string>revertDocumentToSaved:</string>
+							<string>runPageLayout:</string>
+							<string>saveDocument:</string>
+							<string>saveDocumentAs:</string>
+							<string>saveDocumentTo:</string>
+						</object>
+						<object class="NSMutableArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<object class="IBActionInfo">
+								<string key="name">printDocument:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">revertDocumentToSaved:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">runPageLayout:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">saveDocument:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">saveDocumentAs:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">saveDocumentTo:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+						</object>
+					</object>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSDocument.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSDocument</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSDocumentScripting.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSDocumentController</string>
+					<string key="superclassName">NSObject</string>
+					<object class="NSMutableDictionary" key="actions">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>clearRecentDocuments:</string>
+							<string>newDocument:</string>
+							<string>openDocument:</string>
+							<string>saveAllDocuments:</string>
+						</object>
+						<object class="NSMutableArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+						</object>
+					</object>
+					<object class="NSMutableDictionary" key="actionInfosByName">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>clearRecentDocuments:</string>
+							<string>newDocument:</string>
+							<string>openDocument:</string>
+							<string>saveAllDocuments:</string>
+						</object>
+						<object class="NSMutableArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<object class="IBActionInfo">
+								<string key="name">clearRecentDocuments:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">newDocument:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">openDocument:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">saveAllDocuments:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+						</object>
+					</object>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSDocumentController.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSFormatter</string>
+					<string key="superclassName">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSMatrix</string>
+					<string key="superclassName">NSControl</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSMatrix.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSMenu</string>
+					<string key="superclassName">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="136824428">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSMenu.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSMenuItem</string>
+					<string key="superclassName">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="171959132">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSMovieView</string>
+					<string key="superclassName">NSView</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSMovieView.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<reference key="sourceIdentifier" ref="785325875"/>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<reference key="sourceIdentifier" ref="806686590"/>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<reference key="sourceIdentifier" ref="301712406"/>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<reference key="sourceIdentifier" ref="787388657"/>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSDragging.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<reference key="sourceIdentifier" ref="136824428"/>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="521965700">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSTableView.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="104369095">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSView.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSError.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSResponder</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSResponder</string>
+					<string key="superclassName">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSResponder.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSTableView</string>
+					<string key="superclassName">NSControl</string>
+					<reference key="sourceIdentifier" ref="521965700"/>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSText</string>
+					<string key="superclassName">NSView</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSText.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSView</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSClipView.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSView</string>
+					<reference key="sourceIdentifier" ref="171959132"/>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSView</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSView</string>
+					<string key="superclassName">NSResponder</string>
+					<reference key="sourceIdentifier" ref="104369095"/>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSWindow</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSWindow</string>
+					<string key="superclassName">NSResponder</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSWindow.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSWindow</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBFrameworkSource</string>
+						<string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string>
+					</object>
+				</object>
+			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
 		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
 			<integer value="1050" key="NS.object.0"/>
 		</object>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+			<integer value="1050" key="NS.object.0"/>
+		</object>
 		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
 			<integer value="3000" key="NS.object.0"/>
 		</object>
 		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
-		<string key="IBDocument.LastKnownRelativeProjectPath">../GoogleBreakpadTest.xcodeproj</string>
+		<string key="IBDocument.LastKnownRelativeProjectPath">../../Breakpad.xcodeproj</string>
 		<int key="IBDocument.defaultPropertyAccessControl">3</int>
 		<object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
 			<bool key="EncodedWithXMLCoder">YES</bool>
 			<object class="NSArray" key="dict.sortedKeys">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<string>NSMenuCheckmark</string>
 				<string>NSMenuMixedState</string>
 			</object>
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.mm
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.mm
@@ -73,17 +73,17 @@ int InternalTestClass::snooze(int a, flo
 
 void InternalTestClass::InternalFunction(AStruct &s) {
   s.x = InternalTestClass::kStaticFloatValue;
 }
 
 float InternalTestClass::kStaticFloatValue = 42;
 
 static float PlainOldFunction() {
-  return 3.14145;
+  return 3.14145f;
 }
 
 @implementation TestClass
 
 - (void)wait {
   InternalTestClass t(10);
   float z = PlainOldFunction();
 
--- a/toolkit/crashreporter/google-breakpad/src/client/mac/tests/SimpleStringDictionaryTest.h
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/tests/SimpleStringDictionaryTest.h
@@ -22,17 +22,17 @@
 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#import <GTMSenTestCase.h>
+#import "GTMSenTestCase.h"
 #import "SimpleStringDictionary.h"
 
 @interface SimpleStringDictionaryTest : GTMTestCase {
 
 }
 
 - (void)testKeyValueEntry;
 - (void)testSimpleStringDictionary;
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/tests/auto_tempdir.h
@@ -0,0 +1,72 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utility class for creating a temporary directory for unit tests
+// that is deleted in the destructor.
+#ifndef GOOGLE_BREAKPAD_CLIENT_MAC_TESTS_AUTO_TEMPDIR
+#define GOOGLE_BREAKPAD_CLIENT_MAC_TESTS_AUTO_TEMPDIR
+
+#include <dirent.h>
+#include <sys/types.h>
+
+#include <string>
+
+namespace google_breakpad {
+
+class AutoTempDir {
+ public:
+  AutoTempDir() {
+    char tempDir[16] = "/tmp/XXXXXXXXXX";
+    mkdtemp(tempDir);
+    path = tempDir;
+  }
+
+  ~AutoTempDir() {
+    // First remove any files in the dir
+    DIR* dir = opendir(path.c_str());
+    if (!dir)
+      return;
+
+    dirent* entry;
+    while ((entry = readdir(dir)) != NULL) {
+      if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
+	continue;
+      std::string entryPath = path + "/" + entry->d_name;
+      unlink(entryPath.c_str());
+    }
+    closedir(dir);
+    rmdir(path.c_str());
+  }
+
+  std::string path;
+};
+
+}  // namespace google_breakpad
+
+#endif  // GOOGLE_BREAKPAD_CLIENT_MAC_TESTS_AUTO_TEMPDIR
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/tests/crash_generation_server_test.cc
@@ -0,0 +1,223 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// crash_generation_server_test.cc
+// Unit tests for CrashGenerationServer
+
+#include <dirent.h>
+#include <glob.h>
+#include <stdint.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <string>
+
+#include "breakpad_googletest_includes.h"
+#include "client/mac/crash_generation/client_info.h"
+#include "client/mac/crash_generation/crash_generation_client.h"
+#include "client/mac/crash_generation/crash_generation_server.h"
+#include "client/mac/handler/exception_handler.h"
+#include "client/mac/tests/auto_tempdir.h"
+
+namespace {
+using std::string;
+using google_breakpad::AutoTempDir;
+using google_breakpad::ClientInfo;
+using google_breakpad::CrashGenerationClient;
+using google_breakpad::CrashGenerationServer;
+using google_breakpad::ExceptionHandler;
+using testing::Test;
+
+class CrashGenerationServerTest : public Test {
+public:
+  // The port name to receive messages on
+  char mach_port_name[128];
+  // Filename of the last dump that was generated
+  string last_dump_name;
+  // PID of the child process
+  pid_t child_pid;
+  // A temp dir
+  AutoTempDir temp_dir;
+  // Counter just to ensure that we don't hit the same port again
+  static int i;
+
+  void SetUp() {
+    sprintf(mach_port_name,
+	    "com.google.breakpad.ServerTest.%d.%d", getpid(),
+	    CrashGenerationServerTest::i++);
+    child_pid = (pid_t)-1;
+  }
+};
+int CrashGenerationServerTest::i = 0;
+
+// Test that starting and stopping a server works
+TEST_F(CrashGenerationServerTest, testStartStopServer) {
+  CrashGenerationServer server(mach_port_name,
+			       NULL,  // dump callback
+			       NULL,  // dump context
+			       NULL,  // exit callback
+			       NULL,  // exit context
+			       false, // generate dumps
+			       ""); // dump path
+  ASSERT_TRUE(server.Start());
+  ASSERT_TRUE(server.Stop());
+}
+
+// Test that requesting a dump via CrashGenerationClient works
+// Test without actually dumping
+TEST_F(CrashGenerationServerTest, testRequestDumpNoDump) {
+  CrashGenerationServer server(mach_port_name,
+			       NULL,  // dump callback
+			       NULL,  // dump context
+			       NULL,  // exit callback
+			       NULL,  // exit context
+			       false, // don't generate dumps
+			       temp_dir.path); // dump path
+  ASSERT_TRUE(server.Start());
+
+  pid_t pid = fork();
+  ASSERT_NE(-1, pid);
+  if (pid == 0) {
+    CrashGenerationClient client(mach_port_name);
+    bool result = client.RequestDump();
+    exit(result ? 0 : 1);
+  }
+
+  int ret;
+  ASSERT_EQ(pid, waitpid(pid, &ret, 0));
+  EXPECT_TRUE(WIFEXITED(ret));
+  EXPECT_EQ(0, WEXITSTATUS(ret));
+  EXPECT_TRUE(server.Stop());
+  // check that no minidump was written
+  string pattern = temp_dir.path + "/*";
+  glob_t dirContents;
+  ret = glob(pattern.c_str(), GLOB_NOSORT, NULL, &dirContents);
+  EXPECT_EQ(GLOB_NOMATCH, ret);
+  if (ret != GLOB_NOMATCH)
+    globfree(&dirContents);
+}
+
+void dumpCallback(void *context, const ClientInfo &client_info,
+		  const std::string &file_path) {
+  if (context) {
+    CrashGenerationServerTest* self =
+        reinterpret_cast<CrashGenerationServerTest*>(context);
+    if (!file_path.empty())
+      self->last_dump_name = file_path;
+    self->child_pid = client_info.pid();
+  }
+}
+
+void *RequestDump(void *context) {
+  CrashGenerationClient client((const char*)context);
+  bool result = client.RequestDump();
+  return (void*)(result ? 0 : 1);
+}
+
+// Test that actually writing a minidump works
+TEST_F(CrashGenerationServerTest, testRequestDump) {
+  CrashGenerationServer server(mach_port_name,
+			       dumpCallback,  // dump callback
+			       this,  // dump context
+			       NULL,  // exit callback
+			       NULL,  // exit context
+			       true, //  generate dumps
+			       temp_dir.path); // dump path
+  ASSERT_TRUE(server.Start());
+
+  pid_t pid = fork();
+  ASSERT_NE(-1, pid);
+  if (pid == 0) {
+    // Have to spawn off a separate thread to request the dump,
+    // because MinidumpGenerator assumes the handler thread is not
+    // the only thread
+    pthread_t thread;
+    if (pthread_create(&thread, NULL, RequestDump, (void*)mach_port_name) != 0)
+      exit(1);
+    void* result;
+    pthread_join(thread, &result);
+    exit(reinterpret_cast<intptr_t>(result));
+  }
+
+  int ret;
+  ASSERT_EQ(pid, waitpid(pid, &ret, 0));
+  EXPECT_TRUE(WIFEXITED(ret));
+  EXPECT_EQ(0, WEXITSTATUS(ret));
+  EXPECT_TRUE(server.Stop());
+  // check that minidump was written
+  ASSERT_FALSE(last_dump_name.empty());
+  struct stat st;
+  EXPECT_EQ(0, stat(last_dump_name.c_str(), &st));
+  EXPECT_LT(0, st.st_size);
+  // check client's PID
+  ASSERT_EQ(pid, child_pid);
+}
+
+static void Crasher() {
+  int *a = (int*)0x42;
+
+  fprintf(stdout, "Going to crash...\n");
+  fprintf(stdout, "A = %d", *a);
+}
+
+// Test that crashing a child process with an OOP ExceptionHandler installed
+// results in a minidump being written by the CrashGenerationServer in
+// the parent.
+TEST_F(CrashGenerationServerTest, testChildProcessCrash) {
+  CrashGenerationServer server(mach_port_name,
+			       dumpCallback,  // dump callback
+			       this,  // dump context
+			       NULL,  // exit callback
+			       NULL,  // exit context
+			       true, //  generate dumps
+			       temp_dir.path); // dump path
+  ASSERT_TRUE(server.Start());
+
+  pid_t pid = fork();
+  ASSERT_NE(-1, pid);
+  if (pid == 0) {
+    // Instantiate an OOP exception handler.
+    ExceptionHandler eh("", NULL, NULL, NULL, true, mach_port_name);
+    Crasher();
+    // not reached
+    exit(0);
+  }
+
+  int ret;
+  ASSERT_EQ(pid, waitpid(pid, &ret, 0));
+  EXPECT_FALSE(WIFEXITED(ret));
+  EXPECT_TRUE(server.Stop());
+  // check that minidump was written
+  ASSERT_FALSE(last_dump_name.empty());
+  struct stat st;
+  EXPECT_EQ(0, stat(last_dump_name.c_str(), &st));
+  EXPECT_LT(0, st.st_size);  
+}
+
+}  // namespace
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/google-breakpad/src/client/mac/tests/exception_handler_test.cc
@@ -0,0 +1,198 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// exception_handler_test.cc: Unit tests for google_breakpad::ExceptionHandler
+
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "breakpad_googletest_includes.h"
+#include "client/mac/handler/exception_handler.h"
+#include "client/mac/tests/auto_tempdir.h"
+#include "common/mac/MachIPC.h"
+
+namespace {
+using std::string;
+using google_breakpad::AutoTempDir;
+using google_breakpad::ExceptionHandler;
+using google_breakpad::MachPortSender;
+using google_breakpad::MachReceiveMessage;
+using google_breakpad::MachSendMessage;
+using google_breakpad::ReceivePort;
+using testing::Test;
+
+class ExceptionHandlerTest : public Test {
+ public:
+  AutoTempDir tempDir;
+  string lastDumpName;
+};
+
+static void Crasher() {
+  int *a = (int*)0x42;
+
+  fprintf(stdout, "Going to crash...\n");
+  fprintf(stdout, "A = %d", *a);
+}
+
+static void SoonToCrash() {
+  Crasher();
+}
+
+static bool MDCallback(const char *dump_dir, const char *file_name,
+                       void *context, bool success) {
+  string path(dump_dir);
+  path.append("/");
+  path.append(file_name);
+  path.append(".dmp");
+
+  int fd = *reinterpret_cast<int*>(context);
+  (void)write(fd, path.c_str(), path.length() + 1);
+  close(fd);
+  exit(0);
+  // not reached
+  return true;
+}
+
+TEST_F(ExceptionHandlerTest, InProcess) {
+  AutoTempDir tempDir;
+  // Give the child process a pipe to report back on.
+  int fds[2];
+  ASSERT_EQ(0, pipe(fds));
+  // Fork off a child process so it can crash.
+  pid_t pid = fork();
+  if (pid == 0) {
+    // In the child process.
+    close(fds[0]);
+    ExceptionHandler eh(tempDir.path, NULL, MDCallback, &fds[1], true, NULL);
+    // crash
+    SoonToCrash();
+    // not reached
+    exit(1);
+  }
+  // In the parent process.
+  ASSERT_NE(-1, pid);
+  // Wait for the background process to return the minidump file.
+  close(fds[1]);
+  char minidump_file[PATH_MAX];
+  ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file));
+  ASSERT_NE(0, nbytes);
+  // Ensure that minidump file exists and is > 0 bytes.
+  struct stat st;
+  ASSERT_EQ(0, stat(minidump_file, &st));
+  ASSERT_LT(0, st.st_size);
+
+  // Child process should have exited with a zero status.
+  int ret;
+  ASSERT_EQ(pid, waitpid(pid, &ret, 0));
+  EXPECT_NE(0, WIFEXITED(ret));
+  EXPECT_EQ(0, WEXITSTATUS(ret));
+}
+
+static bool ChildMDCallback(const char *dump_dir, const char *file_name,
+			    void *context, bool success) {
+  ExceptionHandlerTest *self = reinterpret_cast<ExceptionHandlerTest*>(context);
+  if (dump_dir && file_name) {
+    self->lastDumpName = dump_dir;
+    self->lastDumpName += "/";
+    self->lastDumpName += file_name;
+    self->lastDumpName += ".dmp";
+  }
+  return true;
+}
+
+TEST_F(ExceptionHandlerTest, DumpChildProcess) {
+  const int kTimeoutMs = 2000;
+  // Create a mach port to receive the child task on.
+  char machPortName[128];
+  sprintf(machPortName, "ExceptionHandlerTest.%d", getpid());
+  ReceivePort parent_recv_port(machPortName);
+
+  // Give the child process a pipe to block on.
+  int fds[2];
+  ASSERT_EQ(0, pipe(fds));
+
+  // Fork off a child process to dump.
+  pid_t pid = fork();
+  if (pid == 0) {
+    // In the child process
+    close(fds[0]);
+
+    // Send parent process the task and thread ports.
+    MachSendMessage child_message(0);
+    child_message.AddDescriptor(mach_task_self());
+    child_message.AddDescriptor(mach_thread_self());
+
+    MachPortSender child_sender(machPortName);
+    if (child_sender.SendMessage(child_message, kTimeoutMs) != KERN_SUCCESS)
+      exit(1);
+
+    // Wait for the parent process.
+    uint8_t data;
+    read(fds[1], &data, 1);
+    exit(0);
+  }
+  // In the parent process.
+  ASSERT_NE(-1, pid);
+  close(fds[1]);
+
+  // Read the child's task and thread ports.
+  MachReceiveMessage child_message;
+  ASSERT_EQ(KERN_SUCCESS,
+	    parent_recv_port.WaitForMessage(&child_message, kTimeoutMs));
+  mach_port_t child_task = child_message.GetTranslatedPort(0);
+  mach_port_t child_thread = child_message.GetTranslatedPort(1);
+  ASSERT_NE(MACH_PORT_NULL, child_task);
+  ASSERT_NE(MACH_PORT_NULL, child_thread);
+
+  // Write a minidump of the child process.
+  bool result = ExceptionHandler::WriteMinidumpForChild(child_task,
+							child_thread,
+							tempDir.path,
+							ChildMDCallback,
+							this);
+  ASSERT_EQ(true, result);
+
+  // Ensure that minidump file exists and is > 0 bytes.
+  ASSERT_FALSE(lastDumpName.empty());
+  struct stat st;
+  ASSERT_EQ(0, stat(lastDumpName.c_str(), &st));
+  ASSERT_LT(0, st.st_size);
+
+  // Unblock child process
+  uint8_t data = 1;
+  (void)write(fds[0], &data, 1);
+
+  // Child process should have exited with a zero status.
+  int ret;
+  ASSERT_EQ(pid, waitpid(pid, &ret, 0));
+  EXPECT_NE(0, WIFEXITED(ret));
+  EXPECT_EQ(0, WEXITSTATUS(ret));
+}
+
+}
--- a/toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer-inl.h
+++ b/toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer-inl.h
@@ -56,37 +56,40 @@ inline bool TypedMDRVA<MDType>::Allocate
 template<typename MDType>
 inline bool TypedMDRVA<MDType>::AllocateArray(size_t count) {
   assert(count);
   allocation_state_ = ARRAY;
   return UntypedMDRVA::Allocate(minidump_size<MDType>::size() * count);
 }
 
 template<typename MDType>
-inline bool TypedMDRVA<MDType>::AllocateObjectAndArray(unsigned int count,
-                                                       size_t size) {
-  assert(count && size);
+inline bool TypedMDRVA<MDType>::AllocateObjectAndArray(size_t count,
+                                                       size_t length) {
+  assert(count && length);
   allocation_state_ = SINGLE_OBJECT_WITH_ARRAY;
-  return UntypedMDRVA::Allocate(minidump_size<MDType>::size() + count * size);
+  return UntypedMDRVA::Allocate(minidump_size<MDType>::size() + count * length);
 }
 
 template<typename MDType>
 inline bool TypedMDRVA<MDType>::CopyIndex(unsigned int index, MDType *item) {
   assert(allocation_state_ == ARRAY);
-  return writer_->Copy(position_ + index * minidump_size<MDType>::size(), item,
-                       minidump_size<MDType>::size());
+  return writer_->Copy(
+      static_cast<MDRVA>(position_ + index * minidump_size<MDType>::size()), 
+      item, minidump_size<MDType>::size());
 }
 
 template<typename MDType>
 inline bool TypedMDRVA<MDType>::CopyIndexAfterObject(unsigned int index,
                                                      const void *src, 
-                                                     size_t size) {
+                                                     size_t length) {
   assert(allocation_state_ == SINGLE_OBJECT_WITH_ARRAY);
-  return writer_->Copy(position_ + minidump_size<MDType>::size() + index * size,
-                       src, size);
+  return writer_->Copy(
+      static_cast<MDRVA>(position_ + minidump_size<MDType>::size() 
+                         + index * length),
+      src, length);
 }
 
 template<typename MDType>
 inline bool TypedMDRVA<MDType>::Flush() {
   return writer_->Copy(position_, &data_, minidump_size<MDType>::size());
 }
 
 }  // namespace google_breakpad
--- a/toolkit/cra