From resistor at mac.com Mon Jun 12 02:05:59 2006
From: resistor at mac.com (Owen Anderson)
Date: Mon, 12 Jun 2006 02:05:59 -0500
Subject: [llvm-commits]
CVS: llvm/test/Regression/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll
Message-ID: <200606120705.CAA17911@zion.cs.uiuc.edu>
Changes in directory llvm/test/Regression/Transforms/LCSSA:
2006-06-12-MultipleExitsSameBlock.ll added (r1.1)
---
Log message:
Make sure that LCSSA works properly when it encounters an exit block that has
more than one predecessor inside the loop.
---
Diffs of the changes: (+28 -0)
2006-06-12-MultipleExitsSameBlock.ll | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+)
Index: llvm/test/Regression/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll
diff -c /dev/null llvm/test/Regression/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll:1.1
*** /dev/null Mon Jun 12 02:05:57 2006
--- llvm/test/Regression/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll Mon Jun 12 02:05:47 2006
***************
*** 0 ****
--- 1,28 ----
+ ; RUN: llvm-as < %s | opt -lcssa | llvm-dis | grep "%X.1.lcssa" &&
+ ; RUN: llvm-as < %s | opt -lcssa | llvm-dis | not grep "%X.1.lcssa1"
+
+ declare bool %c1()
+ declare bool %c2()
+
+ int %foo() {
+ entry:
+ br label %loop_begin
+
+ loop_begin:
+ br bool true, label %loop_body.1, label %loop_exit2
+
+ loop_body.1:
+ %X.1 = add int 0, 1
+ %rel.1 = call bool %c1()
+ br bool %rel.1, label %loop_exit, label %loop_body.2
+
+ loop_body.2:
+ %rel.2 = call bool %c2()
+ br bool %rel.2, label %loop_exit, label %loop_begin
+
+ loop_exit:
+ ret int %X.1
+
+ loop_exit2:
+ ret int 1
+ }
From resistor at mac.com Mon Jun 12 02:10:29 2006
From: resistor at mac.com (Owen Anderson)
Date: Mon, 12 Jun 2006 02:10:29 -0500
Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/LCSSA.cpp
Message-ID: <200606120710.CAA19412@zion.cs.uiuc.edu>
Changes in directory llvm/lib/Transforms/Utils:
LCSSA.cpp updated: 1.19 -> 1.20
---
Log message:
Fix for 2006-06-26-MultipleExitsSingleBlock.
If a single exit block has multiple predecessors within the loop, it will
appear in the exit blocks list more than once. LCSSA needs to take that into
account so that it doesn't double process that exit block.
---
Diffs of the changes: (+7 -4)
LCSSA.cpp | 11 +++++++----
1 files changed, 7 insertions(+), 4 deletions(-)
Index: llvm/lib/Transforms/Utils/LCSSA.cpp
diff -u llvm/lib/Transforms/Utils/LCSSA.cpp:1.19 llvm/lib/Transforms/Utils/LCSSA.cpp:1.20
--- llvm/lib/Transforms/Utils/LCSSA.cpp:1.19 Sun Jun 11 14:22:28 2006
+++ llvm/lib/Transforms/Utils/LCSSA.cpp Mon Jun 12 02:10:16 2006
@@ -155,13 +155,16 @@
std::vector workList;
for (std::vector::const_iterator BBI = exitBlocks.begin(),
- BBE = exitBlocks.end(); BBI != BBE; ++BBI)
- if (DT->getNode(Instr->getParent())->dominates(DT->getNode(*BBI))) {
- PHINode *phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa",
+ BBE = exitBlocks.end(); BBI != BBE; ++BBI) {
+ Instruction*& phi = Phis[*BBI];
+ if (phi == 0 &&
+ DT->getNode(Instr->getParent())->dominates(DT->getNode(*BBI))) {
+ phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa",
(*BBI)->begin());
- workList.push_back(phi);
+ workList.push_back(cast(phi));
Phis[*BBI] = phi;
}
+ }
// Phi nodes that need to have their incoming values filled.
std::vector needIncomingValues;
From rafael.espindola at gmail.com Mon Jun 12 07:28:36 2006
From: rafael.espindola at gmail.com (Rafael Espindola)
Date: Mon, 12 Jun 2006 07:28:36 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
Message-ID: <200606121228.HAA24354@zion.cs.uiuc.edu>
Changes in directory llvm/lib/Target/ARM:
ARMISelDAGToDAG.cpp updated: 1.11 -> 1.12
---
Log message:
lower more then 4 formal arguments. The offset is currently hard coded.
implement SelectFrameIndex
---
Diffs of the changes: (+50 -15)
ARMISelDAGToDAG.cpp | 65 ++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 50 insertions(+), 15 deletions(-)
Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.11 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.12
--- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.11 Mon Jun 5 17:26:14 2006
+++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Mon Jun 12 07:28:08 2006
@@ -74,30 +74,49 @@
return DAG.getNode(ISD::BRIND, MVT::Other, Copy, LR);
}
-static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG) {
+static SDOperand LowerFORMAL_ARGUMENT(SDOperand Op, SelectionDAG &DAG,
+ unsigned ArgNo) {
MachineFunction &MF = DAG.getMachineFunction();
- SSARegMap *RegMap = MF.getSSARegMap();
- std::vector ArgValues;
+ MVT::ValueType ObjectVT = Op.getValue(ArgNo).getValueType();
+ assert (ObjectVT == MVT::i32);
SDOperand Root = Op.getOperand(0);
+ SSARegMap *RegMap = MF.getSSARegMap();
- unsigned reg_idx = 0;
unsigned num_regs = 4;
-
static const unsigned REGS[] = {
ARM::R0, ARM::R1, ARM::R2, ARM::R3
};
- for (unsigned ArgNo = 0, e = Op.Val->getNumValues()-1; ArgNo != e; ++ArgNo) {
- SDOperand ArgVal;
+ if(ArgNo < num_regs) {
+ unsigned VReg = RegMap->createVirtualRegister(&ARM::IntRegsRegClass);
+ MF.addLiveIn(REGS[ArgNo], VReg);
+ return DAG.getCopyFromReg(Root, VReg, MVT::i32);
+ } else {
+ // If the argument is actually used, emit a load from the right stack
+ // slot.
+ if (!Op.Val->hasNUsesOfValue(0, ArgNo)) {
+ //hack
+ unsigned ArgOffset = 0;
+
+ MachineFrameInfo *MFI = MF.getFrameInfo();
+ unsigned ObjSize = MVT::getSizeInBits(ObjectVT)/8;
+ int FI = MFI->CreateFixedObject(ObjSize, ArgOffset);
+ SDOperand FIN = DAG.getFrameIndex(FI, MVT::i32);
+ return DAG.getLoad(ObjectVT, Root, FIN,
+ DAG.getSrcValue(NULL));
+ } else {
+ // Don't emit a dead load.
+ return DAG.getNode(ISD::UNDEF, ObjectVT);
+ }
+ }
+}
- MVT::ValueType ObjectVT = Op.getValue(ArgNo).getValueType();
- assert (ObjectVT == MVT::i32);
+static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG) {
+ std::vector ArgValues;
+ SDOperand Root = Op.getOperand(0);
- assert(reg_idx < num_regs);
- unsigned VReg = RegMap->createVirtualRegister(&ARM::IntRegsRegClass);
- MF.addLiveIn(REGS[reg_idx], VReg);
- ArgVal = DAG.getCopyFromReg(Root, VReg, MVT::i32);
- ++reg_idx;
+ for (unsigned ArgNo = 0, e = Op.Val->getNumValues()-1; ArgNo != e; ++ArgNo) {
+ SDOperand ArgVal = LowerFORMAL_ARGUMENT(Op, DAG, ArgNo);
ArgValues.push_back(ArgVal);
}
@@ -164,8 +183,24 @@
ScheduleAndEmitDAG(DAG);
}
+static void SelectFrameIndex(SelectionDAG *CurDAG, SDOperand &Result, SDNode *N) {
+ int FI = cast(N)->getIndex();
+ Result = CurDAG->SelectNodeTo(N, ARM::movrr, MVT::i32,
+ CurDAG->getTargetFrameIndex(FI, MVT::i32));
+}
+
void ARMDAGToDAGISel::Select(SDOperand &Result, SDOperand Op) {
- SelectCode(Result, Op);
+ SDNode *N = Op.Val;
+
+ switch (N->getOpcode()) {
+ default:
+ SelectCode(Result, Op);
+ break;
+
+ case ISD::FrameIndex:
+ SelectFrameIndex(CurDAG, Result, N);
+ break;
+ }
}
} // end anonymous namespace
From alenhar2 at cs.uiuc.edu Mon Jun 12 11:06:20 2006
From: alenhar2 at cs.uiuc.edu (Andrew Lenharth)
Date: Mon, 12 Jun 2006 11:06:20 -0500
Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h
Message-ID: <200606121606.LAA31813@zion.cs.uiuc.edu>
Changes in directory llvm/include/llvm/Target:
TargetLowering.h updated: 1.76 -> 1.77
---
Log message:
Start on my todo list
---
Diffs of the changes: (+2 -3)
TargetLowering.h | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
Index: llvm/include/llvm/Target/TargetLowering.h
diff -u llvm/include/llvm/Target/TargetLowering.h:1.76 llvm/include/llvm/Target/TargetLowering.h:1.77
--- llvm/include/llvm/Target/TargetLowering.h:1.76 Wed May 24 14:21:13 2006
+++ llvm/include/llvm/Target/TargetLowering.h Mon Jun 12 11:06:08 2006
@@ -25,7 +25,6 @@
#include "llvm/Type.h"
#include "llvm/CodeGen/SelectionDAGNodes.h"
#include
-#include
namespace llvm {
class Value;
@@ -654,9 +653,9 @@
// Div utility functions
//
SDOperand BuildSDIV(SDNode *N, SelectionDAG &DAG,
- std::list* Created) const;
+ std::vector* Created) const;
SDOperand BuildUDIV(SDNode *N, SelectionDAG &DAG,
- std::list* Created) const;
+ std::vector* Created) const;
protected:
From alenhar2 at cs.uiuc.edu Mon Jun 12 11:06:55 2006
From: alenhar2 at cs.uiuc.edu (Andrew Lenharth)
Date: Mon, 12 Jun 2006 11:06:55 -0500
Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Message-ID: <200606121606.LAA31852@zion.cs.uiuc.edu>
Changes in directory llvm/lib/CodeGen/SelectionDAG:
DAGCombiner.cpp updated: 1.172 -> 1.173
---
Log message:
Start on my todo list
---
Diffs of the changes: (+4 -4)
DAGCombiner.cpp | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.172 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.173
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.172 Wed May 31 01:08:35 2006
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Jun 12 11:06:43 2006
@@ -3454,10 +3454,10 @@
/// multiplying by a magic number. See:
///
SDOperand DAGCombiner::BuildSDIV(SDNode *N) {
- std::list Built;
+ std::vector Built;
SDOperand S = TLI.BuildSDIV(N, DAG, &Built);
- for (std::list::iterator ii = Built.begin(), ee = Built.end();
+ for (std::vector::iterator ii = Built.begin(), ee = Built.end();
ii != ee; ++ii)
AddToWorkList(*ii);
return S;
@@ -3468,10 +3468,10 @@
/// multiplying by a magic number. See:
///
SDOperand DAGCombiner::BuildUDIV(SDNode *N) {
- std::list Built;
+ std::vector Built;
SDOperand S = TLI.BuildUDIV(N, DAG, &Built);
- for (std::list::iterator ii = Built.begin(), ee = Built.end();
+ for (std::vector::iterator ii = Built.begin(), ee = Built.end();
ii != ee; ++ii)
AddToWorkList(*ii);
return S;
From alenhar2 at cs.uiuc.edu Mon Jun 12 11:07:30 2006
From: alenhar2 at cs.uiuc.edu (Andrew Lenharth)
Date: Mon, 12 Jun 2006 11:07:30 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/TargetLowering.cpp
Message-ID: <200606121607.LAA31879@zion.cs.uiuc.edu>
Changes in directory llvm/lib/Target:
TargetLowering.cpp updated: 1.66 -> 1.67
---
Log message:
Start on my todo list
---
Diffs of the changes: (+2 -2)
TargetLowering.cpp | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
Index: llvm/lib/Target/TargetLowering.cpp
diff -u llvm/lib/Target/TargetLowering.cpp:1.66 llvm/lib/Target/TargetLowering.cpp:1.67
--- llvm/lib/Target/TargetLowering.cpp:1.66 Wed May 17 13:22:14 2006
+++ llvm/lib/Target/TargetLowering.cpp Mon Jun 12 11:07:18 2006
@@ -1511,7 +1511,7 @@
/// multiplying by a magic number. See:
///
SDOperand TargetLowering::BuildSDIV(SDNode *N, SelectionDAG &DAG,
- std::list* Created) const {
+ std::vector* Created) const {
MVT::ValueType VT = N->getValueType(0);
// Check to see if we can do this.
@@ -1559,7 +1559,7 @@
/// multiplying by a magic number. See:
///
SDOperand TargetLowering::BuildUDIV(SDNode *N, SelectionDAG &DAG,
- std::list* Created) const {
+ std::vector* Created) const {
MVT::ValueType VT = N->getValueType(0);
// Check to see if we can do this.
From alenhar2 at cs.uiuc.edu Mon Jun 12 13:09:36 2006
From: alenhar2 at cs.uiuc.edu (Andrew Lenharth)
Date: Mon, 12 Jun 2006 13:09:36 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelLowering.cpp
AlphaISelLowering.h AlphaInstrFormats.td AlphaInstrInfo.td
AlphaRegisterInfo.cpp
Message-ID: <200606121809.NAA32598@zion.cs.uiuc.edu>
Changes in directory llvm/lib/Target/Alpha:
AlphaISelLowering.cpp updated: 1.49 -> 1.50
AlphaISelLowering.h updated: 1.16 -> 1.17
AlphaInstrFormats.td updated: 1.27 -> 1.28
AlphaInstrInfo.td updated: 1.120 -> 1.121
AlphaRegisterInfo.cpp updated: 1.45 -> 1.46
---
Log message:
Let the alpha breakage begin. First Formals and RET. next Calls
---
Diffs of the changes: (+102 -72)
AlphaISelLowering.cpp | 141 +++++++++++++++++++++++++++-----------------------
AlphaISelLowering.h | 10 +--
AlphaInstrFormats.td | 14 ++++
AlphaInstrInfo.td | 7 ++
AlphaRegisterInfo.cpp | 2
5 files changed, 102 insertions(+), 72 deletions(-)
Index: llvm/lib/Target/Alpha/AlphaISelLowering.cpp
diff -u llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.49 llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.50
--- llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.49 Tue May 16 12:42:15 2006
+++ llvm/lib/Target/Alpha/AlphaISelLowering.cpp Mon Jun 12 13:09:24 2006
@@ -128,6 +128,8 @@
setOperationAction(ISD::VAARG, MVT::Other, Custom);
setOperationAction(ISD::VAARG, MVT::i32, Custom);
+ setOperationAction(ISD::RET, MVT::Other, Custom);
+
setStackPointerRegisterToSaveRestore(Alpha::R30);
setOperationAction(ISD::ConstantFP, MVT::f64, Expand);
@@ -154,6 +156,7 @@
case AlphaISD::GlobalBaseReg: return "Alpha::GlobalBaseReg";
case AlphaISD::CALL: return "Alpha::CALL";
case AlphaISD::DivCall: return "Alpha::DivCall";
+ case AlphaISD::RET_FLAG: return "Alpha::RET_FLAG";
}
}
@@ -175,116 +178,121 @@
// //#define GP $29
// //#define SP $30
-std::vector
-AlphaTargetLowering::LowerArguments(Function &F, SelectionDAG &DAG)
-{
+static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG,
+ int &VarArgsBase,
+ int &VarArgsOffset,
+ unsigned int &GP,
+ unsigned int &RA) {
MachineFunction &MF = DAG.getMachineFunction();
MachineFrameInfo *MFI = MF.getFrameInfo();
+ SSARegMap *RegMap = MF.getSSARegMap();
std::vector ArgValues;
+ SDOperand Root = Op.getOperand(0);
+
+ GP = AddLiveIn(MF, Alpha::R29, &Alpha::GPRCRegClass);
+ RA = AddLiveIn(MF, Alpha::R26, &Alpha::GPRCRegClass);
unsigned args_int[] = {
Alpha::R16, Alpha::R17, Alpha::R18, Alpha::R19, Alpha::R20, Alpha::R21};
unsigned args_float[] = {
Alpha::F16, Alpha::F17, Alpha::F18, Alpha::F19, Alpha::F20, Alpha::F21};
-
- int count = 0;
-
- GP = AddLiveIn(MF, Alpha::R29, getRegClassFor(MVT::i64));
- RA = AddLiveIn(MF, Alpha::R26, getRegClassFor(MVT::i64));
-
- for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I)
- {
+
+ for (unsigned ArgNo = 0, e = Op.Val->getNumValues()-1; ArgNo != e; ++ArgNo) {
SDOperand argt;
- if (count < 6) {
+ MVT::ValueType ObjectVT = Op.getValue(ArgNo).getValueType();
+ SDOperand ArgVal;
+
+ if (ArgNo < 6) {
unsigned Vreg;
- MVT::ValueType VT = getValueType(I->getType());
- switch (VT) {
+ switch (ObjectVT) {
default:
- std::cerr << "Unknown Type " << VT << "\n";
+ std::cerr << "Unknown Type " << ObjectVT << "\n";
abort();
case MVT::f64:
case MVT::f32:
- args_float[count] = AddLiveIn(MF, args_float[count], getRegClassFor(VT));
- argt = DAG.getCopyFromReg(DAG.getRoot(), args_float[count], VT);
- DAG.setRoot(argt.getValue(1));
+ args_float[ArgNo] = AddLiveIn(MF, args_float[ArgNo],
+ &Alpha::F8RCRegClass);
+ ArgVal = DAG.getCopyFromReg(Root, args_float[ArgNo], ObjectVT);
break;
- case MVT::i1:
- case MVT::i8:
- case MVT::i16:
- case MVT::i32:
case MVT::i64:
- args_int[count] = AddLiveIn(MF, args_int[count], getRegClassFor(MVT::i64));
- argt = DAG.getCopyFromReg(DAG.getRoot(), args_int[count], MVT::i64);
- DAG.setRoot(argt.getValue(1));
- if (VT != MVT::i64) {
- unsigned AssertOp =
- I->getType()->isSigned() ? ISD::AssertSext : ISD::AssertZext;
- argt = DAG.getNode(AssertOp, MVT::i64, argt,
- DAG.getValueType(VT));
- argt = DAG.getNode(ISD::TRUNCATE, VT, argt);
- }
+ args_int[ArgNo] = AddLiveIn(MF, args_int[ArgNo],
+ &Alpha::GPRCRegClass);
+ ArgVal = DAG.getCopyFromReg(Root, args_int[ArgNo], MVT::i64);
break;
}
} else { //more args
// Create the frame index object for this incoming parameter...
- int FI = MFI->CreateFixedObject(8, 8 * (count - 6));
+ int FI = MFI->CreateFixedObject(8, 8 * (ArgNo - 6));
// Create the SelectionDAG nodes corresponding to a load
//from this parameter
SDOperand FIN = DAG.getFrameIndex(FI, MVT::i64);
- argt = DAG.getLoad(getValueType(I->getType()),
- DAG.getEntryNode(), FIN, DAG.getSrcValue(NULL));
+ ArgVal = DAG.getLoad(ObjectVT, Root, FIN, DAG.getSrcValue(NULL));
}
- ++count;
- ArgValues.push_back(argt);
+ ArgValues.push_back(ArgVal);
}
// If the functions takes variable number of arguments, copy all regs to stack
- if (F.isVarArg()) {
- VarArgsOffset = count * 8;
+ bool isVarArg = cast(Op.getOperand(2))->getValue() != 0;
+ if (isVarArg) {
+ VarArgsOffset = (Op.Val->getNumValues()-1) * 8;
std::vector LS;
for (int i = 0; i < 6; ++i) {
if (MRegisterInfo::isPhysicalRegister(args_int[i]))
- args_int[i] = AddLiveIn(MF, args_int[i], getRegClassFor(MVT::i64));
- SDOperand argt = DAG.getCopyFromReg(DAG.getRoot(), args_int[i], MVT::i64);
+ args_int[i] = AddLiveIn(MF, args_int[i], &Alpha::GPRCRegClass);
+ SDOperand argt = DAG.getCopyFromReg(Root, args_int[i], MVT::i64);
int FI = MFI->CreateFixedObject(8, -8 * (6 - i));
if (i == 0) VarArgsBase = FI;
SDOperand SDFI = DAG.getFrameIndex(FI, MVT::i64);
- LS.push_back(DAG.getNode(ISD::STORE, MVT::Other, DAG.getRoot(), argt,
+ LS.push_back(DAG.getNode(ISD::STORE, MVT::Other, Root, argt,
SDFI, DAG.getSrcValue(NULL)));
if (MRegisterInfo::isPhysicalRegister(args_float[i]))
- args_float[i] = AddLiveIn(MF, args_float[i], getRegClassFor(MVT::f64));
- argt = DAG.getCopyFromReg(DAG.getRoot(), args_float[i], MVT::f64);
+ args_float[i] = AddLiveIn(MF, args_float[i], &Alpha::F8RCRegClass);
+ argt = DAG.getCopyFromReg(Root, args_float[i], MVT::f64);
FI = MFI->CreateFixedObject(8, - 8 * (12 - i));
SDFI = DAG.getFrameIndex(FI, MVT::i64);
- LS.push_back(DAG.getNode(ISD::STORE, MVT::Other, DAG.getRoot(), argt,
+ LS.push_back(DAG.getNode(ISD::STORE, MVT::Other, Root, argt,
SDFI, DAG.getSrcValue(NULL)));
}
//Set up a token factor with all the stack traffic
- DAG.setRoot(DAG.getNode(ISD::TokenFactor, MVT::Other, LS));
+ Root = DAG.getNode(ISD::TokenFactor, MVT::Other, LS);
}
- // Finally, inform the code generator which regs we return values in.
- switch (getValueType(F.getReturnType())) {
- default: assert(0 && "Unknown type!");
- case MVT::isVoid: break;
- case MVT::i1:
- case MVT::i8:
- case MVT::i16:
- case MVT::i32:
- case MVT::i64:
- MF.addLiveOut(Alpha::R0);
- break;
- case MVT::f32:
- case MVT::f64:
- MF.addLiveOut(Alpha::F0);
+ ArgValues.push_back(Root);
+
+ // Return the new list of results.
+ std::vector RetVT(Op.Val->value_begin(),
+ Op.Val->value_end());
+ return DAG.getNode(ISD::MERGE_VALUES, RetVT, ArgValues);
+}
+
+static SDOperand LowerRET(SDOperand Op, SelectionDAG &DAG) {
+ SDOperand Copy;
+ switch (Op.getNumOperands()) {
+ default:
+ assert(0 && "Do not know how to return this many arguments!");
+ abort();
+ case 1:
+ return SDOperand(); // ret void is legal
+ case 3: {
+ MVT::ValueType ArgVT = Op.getOperand(1).getValueType();
+ unsigned ArgReg;
+ if (MVT::isInteger(ArgVT))
+ ArgReg = Alpha::R0;
+ else {
+ assert(MVT::isFloatingPoint(ArgVT));
+ ArgReg = Alpha::F0;
+ }
+ Copy = DAG.getCopyToReg(Op.getOperand(0), ArgReg, Op.getOperand(1),
+ SDOperand());
+ if(DAG.getMachineFunction().liveout_empty())
+ DAG.getMachineFunction().addLiveOut(ArgReg);
break;
}
-
- //return the arguments+
- return ArgValues;
+ }
+ return DAG.getNode(AlphaISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1));
}
std::pair
@@ -371,7 +379,12 @@
///
SDOperand AlphaTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
switch (Op.getOpcode()) {
- default: assert(0 && "Wasn't expecting to be able to lower this!");
+ default: assert(0 && "Wasn't expecting to be able to lower this!");
+ case ISD::FORMAL_ARGUMENTS: return LowerFORMAL_ARGUMENTS(Op, DAG,
+ VarArgsBase,
+ VarArgsOffset,
+ GP, RA);
+ case ISD::RET: return LowerRET(Op,DAG);
case ISD::SINT_TO_FP: {
assert(MVT::i64 == Op.getOperand(0).getValueType() &&
"Unhandled SINT_TO_FP type in custom expander!");
Index: llvm/lib/Target/Alpha/AlphaISelLowering.h
diff -u llvm/lib/Target/Alpha/AlphaISelLowering.h:1.16 llvm/lib/Target/Alpha/AlphaISelLowering.h:1.17
--- llvm/lib/Target/Alpha/AlphaISelLowering.h:1.16 Wed May 24 12:04:04 2006
+++ llvm/lib/Target/Alpha/AlphaISelLowering.h Mon Jun 12 13:09:24 2006
@@ -42,7 +42,10 @@
CALL,
/// DIVCALL - used for special library calls for div and rem
- DivCall
+ DivCall,
+
+ /// return flag operand
+ RET_FLAG
};
}
@@ -64,11 +67,6 @@
//Friendly names for dumps
const char *getTargetNodeName(unsigned Opcode) const;
- /// LowerArguments - This hook must be implemented to indicate how we should
- /// lower the arguments for the specified function, into the specified DAG.
- virtual std::vector
- LowerArguments(Function &F, SelectionDAG &DAG);
-
/// LowerCallTo - This hook lowers an abstract call to a function into an
/// actual call.
virtual std::pair
Index: llvm/lib/Target/Alpha/AlphaInstrFormats.td
diff -u llvm/lib/Target/Alpha/AlphaInstrFormats.td:1.27 llvm/lib/Target/Alpha/AlphaInstrFormats.td:1.28
--- llvm/lib/Target/Alpha/AlphaInstrFormats.td:1.27 Thu Mar 9 11:16:45 2006
+++ llvm/lib/Target/Alpha/AlphaInstrFormats.td Mon Jun 12 13:09:24 2006
@@ -75,6 +75,20 @@
let Inst{15-14} = TB;
let Inst{13-0} = disp;
}
+class MbrpForm opcode, bits<2> TB, dag OL, string asmstr, list pattern, InstrItinClass itin>
+ : InstAlpha {
+ let Pattern=pattern;
+ bits<5> Ra;
+ bits<5> Rb;
+ bits<14> disp;
+
+ let OperandList = OL;
+
+ let Inst{25-21} = Ra;
+ let Inst{20-16} = Rb;
+ let Inst{15-14} = TB;
+ let Inst{13-0} = disp;
+}
//3.3.2
def target : Operand {}
Index: llvm/lib/Target/Alpha/AlphaInstrInfo.td
diff -u llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.120 llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.121
--- llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.120 Sat Jun 3 19:25:51 2006
+++ llvm/lib/Target/Alpha/AlphaInstrInfo.td Mon Jun 12 13:09:24 2006
@@ -28,6 +28,9 @@
def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>;
def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>;
+def retflag : SDNode<"AlphaISD::RET_FLAG", SDTRet,
+ [SDNPHasChain, SDNPOptInFlag]>;
+
// These are target-independent nodes, but have target-specific formats.
def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>;
def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,[SDNPHasChain]>;
@@ -425,8 +428,10 @@
def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>;
-let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in
+let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in {
def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", s_jsr>; //Return from subroutine
+ def RETDAGp : MbrpForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", [(retflag)], s_jsr>; //Return from subroutine
+}
def JMP : MbrForm< 0x1A, 0x00, (ops GPRC:$RD, GPRC:$RS, GPRC:$DISP), "jmp $RD,($RS),$DISP", s_jsr>; //Jump
let isCall = 1, noResults = 1, Ra = 26,
Index: llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp
diff -u llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.45 llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.46
--- llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.45 Wed May 17 19:11:53 2006
+++ llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp Mon Jun 12 13:09:24 2006
@@ -346,7 +346,7 @@
MachineBasicBlock &MBB) const {
const MachineFrameInfo *MFI = MF.getFrameInfo();
MachineBasicBlock::iterator MBBI = prior(MBB.end());
- assert(MBBI->getOpcode() == Alpha::RETDAG
+ assert(MBBI->getOpcode() == Alpha::RETDAG || MBBI->getOpcode() == Alpha::RETDAGp
&& "Can only insert epilog into returning blocks");
bool FP = hasFP(MF);
From lattner at cs.uiuc.edu Mon Jun 12 13:24:44 2006
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon, 12 Jun 2006 13:24:44 -0500
Subject: [llvm-commits]
CVS: llvm/test/Regression/CodeGen/Generic/2006-06-12-LowerSwitchCrash.ll
Message-ID: <200606121824.NAA32722@zion.cs.uiuc.edu>
Changes in directory llvm/test/Regression/CodeGen/Generic:
2006-06-12-LowerSwitchCrash.ll added (r1.1)
---
Log message:
New testcase that crashes llc
---
Diffs of the changes: (+10 -0)
2006-06-12-LowerSwitchCrash.ll | 10 ++++++++++
1 files changed, 10 insertions(+)
Index: llvm/test/Regression/CodeGen/Generic/2006-06-12-LowerSwitchCrash.ll
diff -c /dev/null llvm/test/Regression/CodeGen/Generic/2006-06-12-LowerSwitchCrash.ll:1.1
*** /dev/null Mon Jun 12 13:24:42 2006
--- llvm/test/Regression/CodeGen/Generic/2006-06-12-LowerSwitchCrash.ll Mon Jun 12 13:24:32 2006
***************
*** 0 ****
--- 1,10 ----
+ ; RUN: llvm-as < %s | llc -fast
+
+ float %test(uint %tmp12771278) {
+ switch uint %tmp12771278, label %bb1279 [
+ ]
+
+ bb1279: ; preds = %cond_next1272
+ ret float 1.0
+ }
+
From lattner at cs.uiuc.edu Mon Jun 12 13:25:42 2006
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon, 12 Jun 2006 13:25:42 -0500
Subject: [llvm-commits]
CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Message-ID: <200606121825.NAA00371@zion.cs.uiuc.edu>
Changes in directory llvm/lib/CodeGen/SelectionDAG:
SelectionDAGISel.cpp updated: 1.255 -> 1.256
---
Log message:
Make sure to update the CFG correctly if a switch only has a default dest.
This fixes CodeGen/Generic/2006-06-12-LowerSwitchCrash.ll
---
Diffs of the changes: (+1 -0)
SelectionDAGISel.cpp | 1 +
1 files changed, 1 insertion(+)
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.255 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.256
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.255 Thu Jun 8 13:27:11 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Jun 12 13:25:29 2006
@@ -869,6 +869,7 @@
if (DefaultMBB != NextBlock)
DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, getRoot(),
DAG.getBasicBlock(DefaultMBB)));
+ CurMBB->addSuccessor(DefaultMBB);
return;
}
From lattner at cs.uiuc.edu Mon Jun 12 14:03:29 2006
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon, 12 Jun 2006 14:03:29 -0500
Subject: [llvm-commits] CVS: llvm/utils/NightlyTest.pl
Message-ID: <200606121903.OAA00566@zion.cs.uiuc.edu>
Changes in directory llvm/utils:
NightlyTest.pl updated: 1.108 -> 1.109
---
Log message:
Add a new -compileflags options, remove old externals location specifiers.
People should just use -with-externals.
---
Diffs of the changes: (+12 -25)
NightlyTest.pl | 37 ++++++++++++-------------------------
1 files changed, 12 insertions(+), 25 deletions(-)
Index: llvm/utils/NightlyTest.pl
diff -u llvm/utils/NightlyTest.pl:1.108 llvm/utils/NightlyTest.pl:1.109
--- llvm/utils/NightlyTest.pl:1.108 Wed Jun 7 00:28:07 2006
+++ llvm/utils/NightlyTest.pl Mon Jun 12 14:03:17 2006
@@ -17,9 +17,6 @@
# -norunningtests.
# -norunningtests Do not run the Olden benchmark suite with
# LARGE_PROBLEM_SIZE enabled.
-# -noexternals Do not run the external tests (for cases where povray
-# or SPEC are not installed)
-# -with-externals Specify a directory where the external tests are located.
# -nodejagnu Do not run feature or regression tests
# -parallel Run two parallel jobs with GNU Make.
# -release Build an LLVM Release version
@@ -43,14 +40,15 @@
# override the default.
# -ldflags Next argument specifies that linker options that override
# the default.
-# -extraflags Next argument specifies extra options that are passed to
-# compile the tests.
+# -compileflags Next argument specifies extra options passed to make when
+# building LLVM.
#
# ---------------- Options to configure llvm-test ----------------------------
-# -spec2000path Path to the benchspec directory in the SPEC 2000 distro
-# -spec95path Path to the benchspec directory in the SPEC 95 distro.
-# -povraypath Path to the povray sources
-# -namdpath Path to the namd sources
+# -extraflags Next argument specifies extra options that are passed to
+# compile the tests.
+# -noexternals Do not run the external tests (for cases where povray
+# or SPEC are not installed)
+# -with-externals Specify a directory where the external tests are located.
#
# CVSROOT is the CVS repository from which the tree will be checked out,
# specified either in the full :method:user at host:/dir syntax, or
@@ -100,8 +98,6 @@
my $NICE = "";
my $NODEJAGNU = 0;
-my $LLVMTESTCONFIGARGS = "";
-
sub ReadFile {
if (open (FILE, $_[0])) {
undef $/;
@@ -334,23 +330,14 @@
if (/^-ldflags/) {
$MAKEOPTS = "$MAKEOPTS LD.Flags=\'$ARGV[0]\'"; shift; next;
}
- if (/^-extraflags/) {
+ if (/^-compileflags/) {
+ $MAKEOPTS = "$MAKEOPTS $ARGV[0]"; shift; next;
+ }
+ if (/^-extraflags/) {
$PROGTESTOPTS .= " EXTRA_FLAGS=\'$ARGV[0]\'"; shift; next;
}
if (/^-noexternals$/) { $NOEXTERNALS = 1; next; }
if (/^-nodejagnu$/) { $NODEJAGNU = 1; next; }
- if (/^-spec2000path$/) {
- $LLVMTESTCONFIGARGS .= " --enable-spec2000=$ARGV[0]"; shift; next;
- }
- if (/^-spec95path$/) {
- $LLVMTESTCONFIGARGS .= " --enable-spec95=$ARGV[0]"; shift; next;
- }
- if (/^-povraypath$/) {
- $LLVMTESTCONFIGARGS .= " --enable-povray=$ARGV[0]"; shift; next;
- }
- if (/^-namdpath$/) {
- $LLVMTESTCONFIGARGS .= " --enable-namd=$ARGV[0]"; shift; next;
- }
print "Unknown option: $_ : ignoring!\n";
}
@@ -462,7 +449,7 @@
#
if (!$NOCHECKOUT) {
if ( $VERBOSE ) { print "CONFIGURE STAGE\n"; }
- my $EXTRAFLAGS = "--enable-spec --with-objroot=.$LLVMTESTCONFIGARGS";
+ my $EXTRAFLAGS = "--enable-spec --with-objroot=.";
system "(time -p $NICE ./configure $CONFIGUREARGS $EXTRAFLAGS) > $BuildLog 2>&1";
if ( $VERBOSE ) { print "BUILD STAGE\n"; }
From lattner at cs.uiuc.edu Mon Jun 12 15:17:56 2006
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon, 12 Jun 2006 15:17:56 -0500
Subject: [llvm-commits]
CVS: llvm/test/Regression/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll
Message-ID: <200606122017.PAA00979@zion.cs.uiuc.edu>
Changes in directory llvm/test/Regression/Transforms/SimplifyCFG:
2006-06-12-InfLoop.ll added (r1.1)
---
Log message:
TEstcase that makes simplifycfg infloop.
---
Diffs of the changes: (+613 -0)
2006-06-12-InfLoop.ll | 613 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 613 insertions(+)
Index: llvm/test/Regression/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll
diff -c /dev/null llvm/test/Regression/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll:1.1
*** /dev/null Mon Jun 12 15:17:54 2006
--- llvm/test/Regression/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll Mon Jun 12 15:17:44 2006
***************
*** 0 ****
--- 1,613 ----
+ ; RUN: llvm-as < %s | opt -simplifycfg -disable-output
+
+ void %main(int %c) {
+ entry:
+ %tmp.9 = seteq int %c, 2 ; [#uses=1]
+ br bool %tmp.9, label %endif.0, label %then.0
+
+ then.0: ; preds = %entry
+ ret void
+
+ endif.0: ; preds = %entry
+ br bool false, label %then.1, label %endif.1
+
+ then.1: ; preds = %endif.0
+ ret void
+
+ endif.1: ; preds = %endif.0
+ br bool false, label %then.2, label %endif.2
+
+ then.2: ; preds = %endif.1
+ ret void
+
+ endif.2: ; preds = %endif.1
+ br bool false, label %then.3, label %loopentry.0
+
+ then.3: ; preds = %endif.2
+ ret void
+
+ loopentry.0: ; preds = %endif.2
+ br bool false, label %no_exit.0.preheader, label %loopexit.0
+
+ no_exit.0.preheader: ; preds = %loopentry.0
+ br label %no_exit.0
+
+ no_exit.0: ; preds = %endif.4, %no_exit.0.preheader
+ br bool false, label %then.4, label %endif.4
+
+ then.4: ; preds = %no_exit.0
+ ret void
+
+ endif.4: ; preds = %no_exit.0
+ br bool false, label %no_exit.0, label %loopexit.0.loopexit
+
+ loopexit.0.loopexit: ; preds = %endif.4
+ br label %loopexit.0
+
+ loopexit.0: ; preds = %loopexit.0.loopexit, %loopentry.0
+ br bool false, label %then.5, label %loopentry.1
+
+ then.5: ; preds = %loopexit.0
+ ret void
+
+ loopentry.1: ; preds = %loopexit.0
+ %tmp.143 = setgt int 0, 0 ; [#uses=4]
+ br bool %tmp.143, label %no_exit.1.preheader, label %loopexit.1
+
+ no_exit.1.preheader: ; preds = %loopentry.1
+ br label %no_exit.1
+
+ no_exit.1: ; preds = %endif.6, %no_exit.1.preheader
+ br bool false, label %then.6, label %shortcirc_next.3
+
+ shortcirc_next.3: ; preds = %no_exit.1
+ br bool false, label %then.6, label %shortcirc_next.4
+
+ shortcirc_next.4: ; preds = %shortcirc_next.3
+ br bool false, label %then.6, label %endif.6
+
+ then.6: ; preds = %shortcirc_next.4, %shortcirc_next.3, %no_exit.1
+ ret void
+
+ endif.6: ; preds = %shortcirc_next.4
+ br bool false, label %no_exit.1, label %loopexit.1.loopexit
+
+ loopexit.1.loopexit: ; preds = %endif.6
+ br label %loopexit.1
+
+ loopexit.1: ; preds = %loopexit.1.loopexit, %loopentry.1
+ br bool false, label %then.i, label %loopentry.0.i
+
+ then.i: ; preds = %loopexit.1
+ ret void
+
+ loopentry.0.i: ; preds = %loopexit.1
+ br bool %tmp.143, label %no_exit.0.i.preheader, label %readvector.exit
+
+ no_exit.0.i.preheader: ; preds = %loopentry.0.i
+ br label %no_exit.0.i
+
+ no_exit.0.i: ; preds = %loopexit.1.i, %no_exit.0.i.preheader
+ br bool false, label %no_exit.1.i.preheader, label %loopexit.1.i
+
+ no_exit.1.i.preheader: ; preds = %no_exit.0.i
+ br label %no_exit.1.i
+
+ no_exit.1.i: ; preds = %loopexit.2.i, %no_exit.1.i.preheader
+ br bool false, label %no_exit.2.i.preheader, label %loopexit.2.i
+
+ no_exit.2.i.preheader: ; preds = %no_exit.1.i
+ br label %no_exit.2.i
+
+ no_exit.2.i: ; preds = %no_exit.2.i, %no_exit.2.i.preheader
+ br bool false, label %no_exit.2.i, label %loopexit.2.i.loopexit
+
+ loopexit.2.i.loopexit: ; preds = %no_exit.2.i
+ br label %loopexit.2.i
+
+ loopexit.2.i: ; preds = %loopexit.2.i.loopexit, %no_exit.1.i
+ br bool false, label %no_exit.1.i, label %loopexit.1.i.loopexit
+
+ loopexit.1.i.loopexit: ; preds = %loopexit.2.i
+ br label %loopexit.1.i
+
+ loopexit.1.i: ; preds = %loopexit.1.i.loopexit, %no_exit.0.i
+ br bool false, label %no_exit.0.i, label %readvector.exit.loopexit
+
+ readvector.exit.loopexit: ; preds = %loopexit.1.i
+ br label %readvector.exit
+
+ readvector.exit: ; preds = %readvector.exit.loopexit, %loopentry.0.i
+ br bool %tmp.143, label %loopentry.1.preheader.i, label %loopexit.0.i
+
+ loopentry.1.preheader.i: ; preds = %readvector.exit
+ br label %loopentry.1.outer.i
+
+ loopentry.1.outer.i: ; preds = %loopexit.1.i110, %loopentry.1.preheader.i
+ br label %loopentry.1.i85
+
+ loopentry.1.i85.loopexit: ; preds = %hamming.exit16.i
+ br label %loopentry.1.i85
+
+ loopentry.1.i85: ; preds = %loopentry.1.i85.loopexit, %loopentry.1.outer.i
+ br bool false, label %no_exit.1.preheader.i, label %loopexit.1.i110.loopexit1
+
+ no_exit.1.preheader.i: ; preds = %loopentry.1.i85
+ br label %no_exit.1.i87
+
+ no_exit.1.i87: ; preds = %then.1.i107, %no_exit.1.preheader.i
+ br bool false, label %no_exit.i.i101.preheader, label %hamming.exit.i104
+
+ no_exit.i.i101.preheader: ; preds = %no_exit.1.i87
+ br label %no_exit.i.i101
+
+ no_exit.i.i101: ; preds = %no_exit.i.i101, %no_exit.i.i101.preheader
+ br bool false, label %no_exit.i.i101, label %hamming.exit.i104.loopexit
+
+ hamming.exit.i104.loopexit: ; preds = %no_exit.i.i101
+ br label %hamming.exit.i104
+
+ hamming.exit.i104: ; preds = %hamming.exit.i104.loopexit, %no_exit.1.i87
+ br bool false, label %no_exit.i15.i.preheader, label %hamming.exit16.i
+
+ no_exit.i15.i.preheader: ; preds = %hamming.exit.i104
+ br label %no_exit.i15.i
+
+ no_exit.i15.i: ; preds = %no_exit.i15.i, %no_exit.i15.i.preheader
+ br bool false, label %no_exit.i15.i, label %hamming.exit16.i.loopexit
+
+ hamming.exit16.i.loopexit: ; preds = %no_exit.i15.i
+ br label %hamming.exit16.i
+
+ hamming.exit16.i: ; preds = %hamming.exit16.i.loopexit, %hamming.exit.i104
+ br bool false, label %loopentry.1.i85.loopexit, label %then.1.i107
+
+ then.1.i107: ; preds = %hamming.exit16.i
+ br bool false, label %no_exit.1.i87, label %loopexit.1.i110.loopexit
+
+ loopexit.1.i110.loopexit: ; preds = %then.1.i107
+ br label %loopexit.1.i110
+
+ loopexit.1.i110.loopexit1: ; preds = %loopentry.1.i85
+ br label %loopexit.1.i110
+
+ loopexit.1.i110: ; preds = %loopexit.1.i110.loopexit1, %loopexit.1.i110.loopexit
+ br bool false, label %loopentry.1.outer.i, label %loopexit.0.i.loopexit
+
+ loopexit.0.i.loopexit: ; preds = %loopexit.1.i110
+ br label %loopexit.0.i
+
+ loopexit.0.i: ; preds = %loopexit.0.i.loopexit, %readvector.exit
+ br bool false, label %UnifiedReturnBlock.i113, label %then.2.i112
+
+ then.2.i112: ; preds = %loopexit.0.i
+ br label %checkham.exit
+
+ UnifiedReturnBlock.i113: ; preds = %loopexit.0.i
+ br label %checkham.exit
+
+ checkham.exit: ; preds = %UnifiedReturnBlock.i113, %then.2.i112
+ br bool false, label %loopentry.1.i14.preheader, label %loopentry.3.i.preheader
+
+ loopentry.1.i14.preheader: ; preds = %checkham.exit
+ br label %loopentry.1.i14
+
+ loopentry.1.i14: ; preds = %loopexit.1.i18, %loopentry.1.i14.preheader
+ br bool false, label %no_exit.1.i16.preheader, label %loopexit.1.i18
+
+ no_exit.1.i16.preheader: ; preds = %loopentry.1.i14
+ br label %no_exit.1.i16
+
+ no_exit.1.i16: ; preds = %no_exit.1.i16, %no_exit.1.i16.preheader
+ br bool false, label %no_exit.1.i16, label %loopexit.1.i18.loopexit
+
+ loopexit.1.i18.loopexit: ; preds = %no_exit.1.i16
+ br label %loopexit.1.i18
+
+ loopexit.1.i18: ; preds = %loopexit.1.i18.loopexit, %loopentry.1.i14
+ br bool false, label %loopentry.1.i14, label %loopentry.3.i.loopexit
+
+ loopentry.3.i.loopexit: ; preds = %loopexit.1.i18
+ br label %loopentry.3.i.preheader
+
+ loopentry.3.i.preheader: ; preds = %loopentry.3.i.loopexit, %checkham.exit
+ br label %loopentry.3.i
+
+ loopentry.3.i: ; preds = %endif.1.i, %loopentry.3.i.preheader
+ br bool false, label %loopentry.4.i.preheader, label %endif.1.i
+
+ loopentry.4.i.preheader: ; preds = %loopentry.3.i
+ br label %loopentry.4.i
+
+ loopentry.4.i: ; preds = %loopexit.4.i, %loopentry.4.i.preheader
+ br bool false, label %no_exit.4.i.preheader, label %loopexit.4.i
+
+ no_exit.4.i.preheader: ; preds = %loopentry.4.i
+ br label %no_exit.4.i
+
+ no_exit.4.i: ; preds = %no_exit.4.i.backedge, %no_exit.4.i.preheader
+ br bool false, label %endif.0.i, label %else.i
+
+ else.i: ; preds = %no_exit.4.i
+ br bool false, label %no_exit.4.i.backedge, label %loopexit.4.i.loopexit
+
+ no_exit.4.i.backedge: ; preds = %endif.0.i, %else.i
+ br label %no_exit.4.i
+
+ endif.0.i: ; preds = %no_exit.4.i
+ br bool false, label %no_exit.4.i.backedge, label %loopexit.4.i.loopexit
+
+ loopexit.4.i.loopexit: ; preds = %endif.0.i, %else.i
+ br label %loopexit.4.i
+
+ loopexit.4.i: ; preds = %loopexit.4.i.loopexit, %loopentry.4.i
+ br bool false, label %loopentry.4.i, label %endif.1.i.loopexit
+
+ endif.1.i.loopexit: ; preds = %loopexit.4.i
+ br label %endif.1.i
+
+ endif.1.i: ; preds = %endif.1.i.loopexit, %loopentry.3.i
+ %exitcond = seteq uint 0, 10 ; [#uses=1]
+ br bool %exitcond, label %generateT.exit, label %loopentry.3.i
+
+ generateT.exit: ; preds = %endif.1.i
+ br bool false, label %then.0.i, label %loopentry.1.i30.preheader
+
+ then.0.i: ; preds = %generateT.exit
+ ret void
+
+ loopentry.1.i30.loopexit: ; preds = %loopexit.3.i
+ br label %loopentry.1.i30.backedge
+
+ loopentry.1.i30.preheader: ; preds = %generateT.exit
+ br label %loopentry.1.i30
+
+ loopentry.1.i30: ; preds = %loopentry.1.i30.backedge, %loopentry.1.i30.preheader
+ br bool %tmp.143, label %no_exit.0.i31.preheader, label %loopentry.1.i30.backedge
+
+ loopentry.1.i30.backedge: ; preds = %loopentry.1.i30, %loopentry.1.i30.loopexit
+ br label %loopentry.1.i30
+
+ no_exit.0.i31.preheader: ; preds = %loopentry.1.i30
+ br label %no_exit.0.i31
+
+ no_exit.0.i31: ; preds = %loopexit.3.i, %no_exit.0.i31.preheader
+ br bool false, label %then.1.i, label %else.0.i
+
+ then.1.i: ; preds = %no_exit.0.i31
+ br bool undef, label %then.0.i29, label %loopentry.0.i31
+
+ then.0.i29: ; preds = %then.1.i
+ unreachable
+
+ loopentry.0.i31: ; preds = %then.1.i
+ br bool false, label %no_exit.0.i38.preheader, label %loopentry.1.i.preheader
+
+ no_exit.0.i38.preheader: ; preds = %loopentry.0.i31
+ br label %no_exit.0.i38
+
+ no_exit.0.i38: ; preds = %no_exit.0.i38, %no_exit.0.i38.preheader
+ br bool undef, label %no_exit.0.i38, label %loopentry.1.i.preheader.loopexit
+
+ loopentry.1.i.preheader.loopexit: ; preds = %no_exit.0.i38
+ br label %loopentry.1.i.preheader
+
+ loopentry.1.i.preheader: ; preds = %loopentry.1.i.preheader.loopexit, %loopentry.0.i31
+ br label %loopentry.1.i
+
+ loopentry.1.i: ; preds = %endif.2.i, %loopentry.1.i.preheader
+ br bool undef, label %loopentry.2.i39.preheader, label %loopexit.1.i79.loopexit2
+
+ loopentry.2.i39.preheader: ; preds = %loopentry.1.i
+ br label %loopentry.2.i39
+
+ loopentry.2.i39: ; preds = %loopexit.5.i77, %loopentry.2.i39.preheader
+ br bool false, label %loopentry.3.i40.preheader, label %hamming.exit.i71
+
+ loopentry.3.i40.preheader: ; preds = %loopentry.2.i39
+ br label %loopentry.3.i40
+
+ loopentry.3.i40: ; preds = %loopexit.3.i51, %loopentry.3.i40.preheader
+ br bool false, label %no_exit.3.preheader.i42, label %loopexit.3.i51
+
+ no_exit.3.preheader.i42: ; preds = %loopentry.3.i40
+ br label %no_exit.3.i49
+
+ no_exit.3.i49: ; preds = %no_exit.3.i49, %no_exit.3.preheader.i42
+ br bool undef, label %no_exit.3.i49, label %loopexit.3.i51.loopexit
+
+ loopexit.3.i51.loopexit: ; preds = %no_exit.3.i49
+ br label %loopexit.3.i51
+
+ loopexit.3.i51: ; preds = %loopexit.3.i51.loopexit, %loopentry.3.i40
+ br bool undef, label %loopentry.3.i40, label %loopentry.4.i52
+
+ loopentry.4.i52: ; preds = %loopexit.3.i51
+ br bool false, label %no_exit.4.i54.preheader, label %hamming.exit.i71
+
+ no_exit.4.i54.preheader: ; preds = %loopentry.4.i52
+ br label %no_exit.4.i54
+
+ no_exit.4.i54: ; preds = %no_exit.4.backedge.i, %no_exit.4.i54.preheader
+ br bool undef, label %then.1.i55, label %endif.1.i56
+
+ then.1.i55: ; preds = %no_exit.4.i54
+ br bool undef, label %no_exit.4.backedge.i, label %loopexit.4.i57
+
+ no_exit.4.backedge.i: ; preds = %endif.1.i56, %then.1.i55
+ br label %no_exit.4.i54
+
+ endif.1.i56: ; preds = %no_exit.4.i54
+ br bool undef, label %no_exit.4.backedge.i, label %loopexit.4.i57
+
+ loopexit.4.i57: ; preds = %endif.1.i56, %then.1.i55
+ br bool false, label %no_exit.i.i69.preheader, label %hamming.exit.i71
+
+ no_exit.i.i69.preheader: ; preds = %loopexit.4.i57
+ br label %no_exit.i.i69
+
+ no_exit.i.i69: ; preds = %no_exit.i.i69, %no_exit.i.i69.preheader
+ br bool undef, label %no_exit.i.i69, label %hamming.exit.i71.loopexit
+
+ hamming.exit.i71.loopexit: ; preds = %no_exit.i.i69
+ br label %hamming.exit.i71
+
+ hamming.exit.i71: ; preds = %hamming.exit.i71.loopexit, %loopexit.4.i57, %loopentry.4.i52, %loopentry.2.i39
+ br bool undef, label %endif.2.i, label %loopentry.5.i72
+
+ loopentry.5.i72: ; preds = %hamming.exit.i71
+ br bool false, label %shortcirc_next.i74.preheader, label %loopexit.5.i77
+
+ shortcirc_next.i74.preheader: ; preds = %loopentry.5.i72
+ br label %shortcirc_next.i74
+
+ shortcirc_next.i74: ; preds = %no_exit.5.i76, %shortcirc_next.i74.preheader
+ br bool undef, label %no_exit.5.i76, label %loopexit.5.i77.loopexit
+
+ no_exit.5.i76: ; preds = %shortcirc_next.i74
+ br bool undef, label %shortcirc_next.i74, label %loopexit.5.i77.loopexit
+
+ loopexit.5.i77.loopexit: ; preds = %no_exit.5.i76, %shortcirc_next.i74
+ br label %loopexit.5.i77
+
+ loopexit.5.i77: ; preds = %loopexit.5.i77.loopexit, %loopentry.5.i72
+ br bool undef, label %loopentry.2.i39, label %loopexit.1.i79.loopexit
+
+ endif.2.i: ; preds = %hamming.exit.i71
+ br label %loopentry.1.i
+
+ loopexit.1.i79.loopexit: ; preds = %loopexit.5.i77
+ br label %loopexit.1.i79
+
+ loopexit.1.i79.loopexit2: ; preds = %loopentry.1.i
+ br label %loopexit.1.i79
+
+ loopexit.1.i79: ; preds = %loopexit.1.i79.loopexit2, %loopexit.1.i79.loopexit
+ br bool undef, label %then.3.i, label %loopentry.6.i80
+
+ then.3.i: ; preds = %loopexit.1.i79
+ br bool false, label %no_exit.6.i82.preheader, label %run.exit
+
+ loopentry.6.i80: ; preds = %loopexit.1.i79
+ br bool false, label %no_exit.6.i82.preheader, label %run.exit
+
+ no_exit.6.i82.preheader: ; preds = %loopentry.6.i80, %then.3.i
+ br label %no_exit.6.i82
+
+ no_exit.6.i82: ; preds = %no_exit.6.i82, %no_exit.6.i82.preheader
+ br bool undef, label %no_exit.6.i82, label %run.exit.loopexit
+
+ run.exit.loopexit: ; preds = %no_exit.6.i82
+ br label %run.exit
+
+ run.exit: ; preds = %run.exit.loopexit, %loopentry.6.i80, %then.3.i
+ br bool false, label %no_exit.1.i36.preheader, label %loopentry.3.i37
+
+ else.0.i: ; preds = %no_exit.0.i31
+ br bool false, label %then.0.i4, label %loopentry.0.i6
+
+ then.0.i4: ; preds = %else.0.i
+ unreachable
+
+ loopentry.0.i6: ; preds = %else.0.i
+ br bool false, label %no_exit.0.i8.preheader, label %loopentry.2.i.preheader
+
+ no_exit.0.i8.preheader: ; preds = %loopentry.0.i6
+ br label %no_exit.0.i8
+
+ no_exit.0.i8: ; preds = %no_exit.0.i8, %no_exit.0.i8.preheader
+ br bool false, label %no_exit.0.i8, label %loopentry.2.i.preheader.loopexit
+
+ loopentry.2.i.preheader.loopexit: ; preds = %no_exit.0.i8
+ br label %loopentry.2.i.preheader
+
+ loopentry.2.i.preheader: ; preds = %loopentry.2.i.preheader.loopexit, %loopentry.0.i6
+ br label %loopentry.2.i
+
+ loopentry.2.i: ; preds = %endif.3.i19, %loopentry.2.i.preheader
+ br bool false, label %loopentry.3.i10.preheader, label %loopentry.4.i15
+
+ loopentry.3.i10.preheader: ; preds = %loopentry.2.i
+ br label %loopentry.3.i10
+
+ loopentry.3.i10: ; preds = %loopexit.3.i14, %loopentry.3.i10.preheader
+ br bool false, label %no_exit.3.preheader.i, label %loopexit.3.i14
+
+ no_exit.3.preheader.i: ; preds = %loopentry.3.i10
+ br label %no_exit.3.i12
+
+ no_exit.3.i12: ; preds = %no_exit.3.i12, %no_exit.3.preheader.i
+ br bool false, label %no_exit.3.i12, label %loopexit.3.i14.loopexit
+
+ loopexit.3.i14.loopexit: ; preds = %no_exit.3.i12
+ br label %loopexit.3.i14
+
+ loopexit.3.i14: ; preds = %loopexit.3.i14.loopexit, %loopentry.3.i10
+ br bool false, label %loopentry.3.i10, label %loopentry.4.i15.loopexit
+
+ loopentry.4.i15.loopexit: ; preds = %loopexit.3.i14
+ br label %loopentry.4.i15
+
+ loopentry.4.i15: ; preds = %loopentry.4.i15.loopexit, %loopentry.2.i
+ br bool false, label %loopentry.5.outer.i.preheader, label %loopentry.7.i
+
+ loopentry.5.outer.i.preheader: ; preds = %loopentry.4.i15
+ br label %loopentry.5.outer.i
+
+ loopentry.5.outer.i: ; preds = %loopexit.5.i, %loopentry.5.outer.i.preheader
+ br label %loopentry.5.i
+
+ loopentry.5.i: ; preds = %endif.1.i18, %loopentry.5.outer.i
+ br bool false, label %no_exit.5.i.preheader, label %loopexit.5.i.loopexit3
+
+ no_exit.5.i.preheader: ; preds = %loopentry.5.i
+ br label %no_exit.5.i
+
+ no_exit.5.i: ; preds = %then.2.i, %no_exit.5.i.preheader
+ br bool false, label %loopentry.6.i, label %endif.1.i18
+
+ loopentry.6.i: ; preds = %no_exit.5.i
+ br bool false, label %no_exit.6.preheader.i, label %loopexit.6.i
+
+ no_exit.6.preheader.i: ; preds = %loopentry.6.i
+ br label %no_exit.6.i
+
+ no_exit.6.i: ; preds = %no_exit.6.i, %no_exit.6.preheader.i
+ br bool false, label %no_exit.6.i, label %loopexit.6.i.loopexit
+
+ loopexit.6.i.loopexit: ; preds = %no_exit.6.i
+ br label %loopexit.6.i
+
+ loopexit.6.i: ; preds = %loopexit.6.i.loopexit, %loopentry.6.i
+ br bool false, label %then.2.i, label %endif.1.i18
+
+ then.2.i: ; preds = %loopexit.6.i
+ br bool false, label %no_exit.5.i, label %loopexit.5.i.loopexit
+
+ endif.1.i18: ; preds = %loopexit.6.i, %no_exit.5.i
+ br label %loopentry.5.i
+
+ loopexit.5.i.loopexit: ; preds = %then.2.i
+ br label %loopexit.5.i
+
+ loopexit.5.i.loopexit3: ; preds = %loopentry.5.i
+ br label %loopexit.5.i
+
+ loopexit.5.i: ; preds = %loopexit.5.i.loopexit3, %loopexit.5.i.loopexit
+ br bool false, label %loopentry.5.outer.i, label %loopentry.7.i.loopexit
+
+ loopentry.7.i.loopexit: ; preds = %loopexit.5.i
+ br label %loopentry.7.i
+
+ loopentry.7.i: ; preds = %loopentry.7.i.loopexit, %loopentry.4.i15
+ br bool false, label %no_exit.7.i.preheader, label %hamming.exit.i
+
+ no_exit.7.i.preheader: ; preds = %loopentry.7.i
+ br label %no_exit.7.i
+
+ no_exit.7.i: ; preds = %no_exit.7.i, %no_exit.7.i.preheader
+ br bool false, label %no_exit.7.i, label %loopexit.7.i
+
+ loopexit.7.i: ; preds = %no_exit.7.i
+ br bool false, label %no_exit.i.i.preheader, label %hamming.exit.i
+
+ no_exit.i.i.preheader: ; preds = %loopexit.7.i
+ br label %no_exit.i.i
+
+ no_exit.i.i: ; preds = %no_exit.i.i, %no_exit.i.i.preheader
+ br bool false, label %no_exit.i.i, label %hamming.exit.i.loopexit
+
+ hamming.exit.i.loopexit: ; preds = %no_exit.i.i
+ br label %hamming.exit.i
+
+ hamming.exit.i: ; preds = %hamming.exit.i.loopexit, %loopexit.7.i, %loopentry.7.i
+ br bool false, label %endif.3.i19, label %loopentry.8.i
+
+ loopentry.8.i: ; preds = %hamming.exit.i
+ br bool false, label %shortcirc_next.i.preheader, label %loopexit.8.i
+
+ shortcirc_next.i.preheader: ; preds = %loopentry.8.i
+ br label %shortcirc_next.i
+
+ shortcirc_next.i: ; preds = %no_exit.8.i, %shortcirc_next.i.preheader
+ br bool false, label %no_exit.8.i, label %loopexit.8.i.loopexit
+
+ no_exit.8.i: ; preds = %shortcirc_next.i
+ br bool false, label %shortcirc_next.i, label %loopexit.8.i.loopexit
+
+ loopexit.8.i.loopexit: ; preds = %no_exit.8.i, %shortcirc_next.i
+ br label %loopexit.8.i
+
+ loopexit.8.i: ; preds = %loopexit.8.i.loopexit, %loopentry.8.i
+ br bool false, label %no_exit.9.i.preheader, label %endif.3.i19
+
+ no_exit.9.i.preheader: ; preds = %loopexit.8.i
+ br label %no_exit.9.i
+
+ no_exit.9.i: ; preds = %no_exit.9.i, %no_exit.9.i.preheader
+ br bool false, label %no_exit.9.i, label %endif.3.i19.loopexit
+
+ endif.3.i19.loopexit: ; preds = %no_exit.9.i
+ br label %endif.3.i19
+
+ endif.3.i19: ; preds = %endif.3.i19.loopexit, %loopexit.8.i, %hamming.exit.i
+ br bool false, label %loopentry.2.i, label %loopexit.1.i20
+
+ loopexit.1.i20: ; preds = %endif.3.i19
+ br bool false, label %then.4.i, label %UnifiedReturnBlock.i
+
+ then.4.i: ; preds = %loopexit.1.i20
+ br label %runcont.exit
+
+ UnifiedReturnBlock.i: ; preds = %loopexit.1.i20
+ br label %runcont.exit
+
+ runcont.exit: ; preds = %UnifiedReturnBlock.i, %then.4.i
+ br bool false, label %no_exit.1.i36.preheader, label %loopentry.3.i37
+
+ no_exit.1.i36.preheader: ; preds = %runcont.exit, %run.exit
+ br label %no_exit.1.i36
+
+ no_exit.1.i36: ; preds = %no_exit.1.i36, %no_exit.1.i36.preheader
+ br bool false, label %no_exit.1.i36, label %loopentry.3.i37.loopexit
+
+ loopentry.3.i37.loopexit: ; preds = %no_exit.1.i36
+ br label %loopentry.3.i37
+
+ loopentry.3.i37: ; preds = %loopentry.3.i37.loopexit, %runcont.exit, %run.exit
+ br bool false, label %loopentry.4.i38.preheader, label %loopexit.3.i
+
+ loopentry.4.i38.preheader: ; preds = %loopentry.3.i37
+ br label %loopentry.4.i38
+
+ loopentry.4.i38: ; preds = %loopexit.4.i42, %loopentry.4.i38.preheader
+ br bool false, label %no_exit.3.i.preheader, label %loopexit.4.i42
+
+ no_exit.3.i.preheader: ; preds = %loopentry.4.i38
+ br label %no_exit.3.i
+
+ no_exit.3.i: ; preds = %no_exit.3.i.backedge, %no_exit.3.i.preheader
+ br bool false, label %endif.3.i, label %else.1.i
+
+ else.1.i: ; preds = %no_exit.3.i
+ br bool false, label %no_exit.3.i.backedge, label %loopexit.4.i42.loopexit
+
+ no_exit.3.i.backedge: ; preds = %endif.3.i, %else.1.i
+ br label %no_exit.3.i
+
+ endif.3.i: ; preds = %no_exit.3.i
+ br bool false, label %no_exit.3.i.backedge, label %loopexit.4.i42.loopexit
+
+ loopexit.4.i42.loopexit: ; preds = %endif.3.i, %else.1.i
+ br label %loopexit.4.i42
+
+ loopexit.4.i42: ; preds = %loopexit.4.i42.loopexit, %loopentry.4.i38
+ br bool false, label %loopentry.4.i38, label %loopexit.3.i.loopexit
+
+ loopexit.3.i.loopexit: ; preds = %loopexit.4.i42
+ br label %loopexit.3.i
+
+ loopexit.3.i: ; preds = %loopexit.3.i.loopexit, %loopentry.3.i37
+ %tmp.13.i155 = setlt int 0, 0 ; [#uses=1]
+ br bool %tmp.13.i155, label %no_exit.0.i31, label %loopentry.1.i30.loopexit
+ }
From lattner at cs.uiuc.edu Mon Jun 12 15:18:13 2006
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon, 12 Jun 2006 15:18:13 -0500
Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/SimplifyCFG.cpp
Message-ID: <200606122018.PAA00991@zion.cs.uiuc.edu>
Changes in directory llvm/lib/Transforms/Utils:
SimplifyCFG.cpp updated: 1.97 -> 1.98
---
Log message:
Fix an infinite loop on Transforms/SimplifyCFG/2006-06-12-InfLoop.ll
---
Diffs of the changes: (+10 -1)
SimplifyCFG.cpp | 11 ++++++++++-
1 files changed, 10 insertions(+), 1 deletion(-)
Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp
diff -u llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.97 llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.98
--- llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.97 Sun May 14 13:45:44 2006
+++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp Mon Jun 12 15:18:01 2006
@@ -1515,12 +1515,21 @@
// keep getting unwound.
if (PBIOp != -1 && PBI->getSuccessor(PBIOp) == BB)
PBIOp = BIOp = -1;
-
+
// Finally, if everything is ok, fold the branches to logical ops.
if (PBIOp != -1) {
BasicBlock *CommonDest = PBI->getSuccessor(PBIOp);
BasicBlock *OtherDest = BI->getSuccessor(BIOp ^ 1);
+ // If OtherDest *is* BB, then this is a basic block with just
+ // a conditional branch in it, where one edge (OtherDesg) goes
+ // back to the block. We know that the program doesn't get
+ // stuck in the infinite loop, so the condition must be such
+ // that OtherDest isn't branched through. Forward to CommonDest,
+ // and avoid an infinite loop at optimizer time.
+ if (OtherDest == BB)
+ OtherDest = CommonDest;
+
DEBUG(std::cerr << "FOLDING BRs:" << *PBI->getParent()
<< "AND: " << *BI->getParent());
From lattner at cs.uiuc.edu Mon Jun 12 15:32:56 2006
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon, 12 Jun 2006 15:32:56 -0500
Subject: [llvm-commits] CVS: llvm-www/pubs/2006-06-07-LewyckyChecker.html
2006-06-07-LewyckyChecker.pdf 2006-06-07-LewyckyChecker.ps
Message-ID: <200606122032.PAA01227@zion.cs.uiuc.edu>
Changes in directory llvm-www/pubs:
2006-06-07-LewyckyChecker.html added (r1.1)
2006-06-07-LewyckyChecker.pdf added (r1.1)
2006-06-07-LewyckyChecker.ps added (r1.1)
---
Log message:
New thesis
---
Diffs of the changes: (+5254 -0)
2006-06-07-LewyckyChecker.html | 56
2006-06-07-LewyckyChecker.pdf | 0
2006-06-07-LewyckyChecker.ps | 5198 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 5254 insertions(+)
Index: llvm-www/pubs/2006-06-07-LewyckyChecker.html
diff -c /dev/null llvm-www/pubs/2006-06-07-LewyckyChecker.html:1.1
*** /dev/null Mon Jun 12 15:32:54 2006
--- llvm-www/pubs/2006-06-07-LewyckyChecker.html Mon Jun 12 15:32:44 2006
***************
*** 0 ****
--- 1,56 ----
+
+
+
+
+
+ Checker: a Static Program Checker
+
+
+
+
+ Checker: a Static Program Checker
+
+
+ Nicholas Lewycky, B.Sc. Thesis
+
+
+
+ Abstract:
+
+ Automated software analysis is the process of testing program source
+ code against a set of conditions. These may be as simple as verifying
+ the coding standards, or as complicated as new languages which are
+ formally verifiable by a theorem solver.
+
+ Checker is able to find two small classes of errors, one is memory
+ faults, the other, non-deterministic behaviour. Lacking interprocedural
+ analysis, checker can not be applied to real-world software.
+
+
+ Published:
+
+ Checker: a Static Program Checker.
+ Undergraduate Thesis , Computer Science Dept., Ryerson University, June 2006.
+
+
+ Download:
+
+
+ BibTeX Entry:
+
+ @MastersThesis{Lewycky:Checker06,
+ author = {Nicholas Lewycky},
+ title = "{Checker: a Static Program Checker}",
+ school = "{Computer Science Dept., Ryerson University}",
+ year = {2006},
+ address = {Toronto, ON},
+ month = {June},
+ note = {{\em See {\tt http://wagon.no-ip.org/checker}.}}
+ }
+
+
+
+
Index: llvm-www/pubs/2006-06-07-LewyckyChecker.pdf
Index: llvm-www/pubs/2006-06-07-LewyckyChecker.ps
diff -c /dev/null llvm-www/pubs/2006-06-07-LewyckyChecker.ps:1.1
*** /dev/null Mon Jun 12 15:32:56 2006
--- llvm-www/pubs/2006-06-07-LewyckyChecker.ps Mon Jun 12 15:32:44 2006
***************
*** 0 ****
--- 1,5198 ----
+ %!PS-Adobe-2.0
+ %%Creator: dvips(k) 5.95a Copyright 2005 Radical Eye Software
+ %%Title: thesis.dvi
+ %%Pages: 18
+ %%PageOrder: Ascend
+ %%BoundingBox: 0 0 612 792
+ %%DocumentFonts: CMR17 CMR12 CMBX10 CMR10 CMBX12 CMTT12 CMMI12 CMR8
+ %%+ CMSY10 CMMI8 CMITT10 CMTI12
+ %%DocumentPaperSizes: Letter
+ %%EndComments
+ %DVIPSWebPage: (www.radicaleye.com)
+ %DVIPSCommandLine: dvips -tletter thesis.dvi -o thesis.ps
+ %DVIPSParameters: dpi=600
+ %DVIPSSource: TeX output 2006.06.07:2255
+ %%BeginProcSet: tex.pro 0 0
+ %!
+ /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+ N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+ mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+ 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+ mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+ exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+ N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+ /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+ /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+ array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+ df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+ definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+ }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+ B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+ 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S
+ /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy
+ setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask
+ restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+ /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+ }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+ mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+ 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+ index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+ /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+ (LaserWriter 16/600)]{A length product length le{A length product exch 0
+ exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+ end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+ grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+ imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+ exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+ fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+ delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+ B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+ rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+ %%EndProcSet
+ %%BeginProcSet: texps.pro 0 0
+ %!
+ TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+ index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+ exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
+ ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
+ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
+ div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
+ /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
+ definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
+ sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
+ mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
+ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
+ forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
+ end
+
+ %%EndProcSet
+ %%BeginProcSet: special.pro 0 0
+ %!
+ TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N
+ /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N
+ /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N
+ /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{
+ /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho
+ X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B
+ /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{
+ /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known
+ {userdict/md get type/dicttype eq{userdict begin md length 10 add md
+ maxlength ge{/md md dup length 20 add dict copy def}if end md begin
+ /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S
+ atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{
+ itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll
+ transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll
+ curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf
+ pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}
+ if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1
+ -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
+ get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip
+ yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub
+ neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{
+ noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop
+ 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get
+ neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr
+ 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr
+ 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4
+ -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S
+ TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{
+ Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale
+ }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState
+ save N userdict maxlength dict begin/magscale true def normalscale
+ currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts
+ /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x
+ psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx
+ psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub
+ TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def
+ @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll
+ newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto
+ closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N
+ /@beginspecial{SDict begin/SpecialSave save N gsave normalscale
+ currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N}
+ N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs
+ neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate
+ rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse
+ scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg
+ lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx
+ ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N
+ /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{
+ pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave
+ restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B
+ /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1
+ setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY
+ moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix
+ matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc
+ savematrix setmatrix}N end
+
+ %%EndProcSet
+ %%BeginFont: CMTI12
+ %!PS-AdobeFont-1.1: CMTI12 1.0
+ %%CreationDate: 1991 Aug 18 21:06:53
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMTI12) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle -14.04 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMTI12 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 38 /ampersand put
+ dup 39 /quoteright put
+ dup 40 /parenleft put
+ dup 41 /parenright put
+ dup 45 /hyphen put
+ dup 46 /period put
+ dup 47 /slash put
+ dup 48 /zero put
+ dup 50 /two put
+ dup 51 /three put
+ dup 52 /four put
+ dup 54 /six put
+ dup 65 /A put
+ dup 67 /C put
+ dup 68 /D put
+ dup 69 /E put
+ dup 71 /G put
+ dup 73 /I put
+ dup 76 /L put
+ dup 77 /M put
+ dup 78 /N put
+ dup 79 /O put
+ dup 80 /P put
+ dup 82 /R put
+ dup 83 /S put
+ dup 84 /T put
+ dup 87 /W put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 121 /y put
+ dup 122 /z put
+ readonly def
+ /FontBBox{-36 -251 1103 750}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+ 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+ 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+ B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+ 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+ D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5
+ 525003F3DBE5BF07B2E83E66B7F97DDD7CE0EEB75A78BD9227BF359D002B6ADB
+ 8AC57A33FED4EF021A7085B1E2B933DE602F0FF71467ECD501744AE338AF29A0
+ 26F7D368AC6F25CCB882DB7B7343566192BD687E1349225982823027D3B66703
+ 3B0DB7A7E680A682B98023D39C7FAE81A5D5B867A0A66C8AA0DBC83B1596A84F
+ 0436AC6A7900B767BDCCE0060A4811003C79FDCC71D73F7F2D0A6675E93AD21A
+ 56B4CD8EF75EED3DE8C0A18BEBF7B9D1BE72504872D56EDB272F1E97FC726CB6
+ 68C85C713059DA19F6C2E0F3E12710A59B6FC4699AE883DE8C8615B7292AC25C
+ D5714B6CFB14EF0EF11EB13009BEBA4F345A5D3D6D9926ABC2BAD7DB1328651E
+ 437BFB3C46DA7B62219660FC368CF3D3704DAD3AB461C28F711665BF484BF61C
+ 052093D231CA65618EA463D63E406ECE858D180A6C0589B2FEDC321371C28E77
+ DE974D655DF5FF7D41ED01FE717D928A885F6FA6CFE4D2C0807F8E7F937916E0
+ 96EDD1A3BA67802B1F4A49100E75613BA0356D9DCBBAD4DAB3C59E70A47058F5
+ 2163D1730F0EE4D1F87C3A4AE723A23CFD7986FC4FBD399347E9F5946354E013
+ D860FC446AFF0B0744F5DA27CC777C96ADB388D1E835DDCBE123FB517679B9B7
+ EE5A3DDDCD392415AF58CE22EA55B7F47031138C6F27798B40F7E18FDD315912
+ BE99F33ADE0FDD538A8A3E5DE58AF68A54732AE69F188F3F7E0458D848205648
+ CBE820C287ADC2394520F03BBB97DB893F6A12154B1B7F8626D35CE6B70F8524
+ CB128DE87821A0E32F1E825F6C50AE8B4BE37FAA3183BA4D678E896CC7E61CC9
+ D0226FC38B9CAE0939D19149D987979B96A86EB69A105807AB426639292FF5FB
+ EFF0817FCFD5E517837AD66AE8E3BBE34EC130F8F3F6460A712601686071854A
+ 3D983D84F6EEC4E6F04912E37ABB067121E0BFD5DBCB38065D15A73B4F148829
+ 7932E91870ED3566BC3384F562C824ED4211BF793113943CCFAC49B348361C48
+ 036E01364F9CA555CFF8E5E888D90B1BBA51911B9E72C8A20C99645E95BBA4D6
+ 2000318B2ECC2322B8504044707C15ED5C5A5F3E62518774C1001132C36B2497
+ 6A5962DD93B8E612EB1C3EC92BAE2E1316E0254540CEF9C8947D1A732FDD6973
+ 2A84D2660A873E495DFB3BB0FF79F2CA458A905871C6B6E1DFABBD7CBED979A4
+ DFC77FDBCEE671F3B9DD5D637A2E5C521F1F725B5A54B15A3635F7A336CEB18C
+ 20D3333E0DF79CAA0A60E7DD01B134CD62688F542F0D2CF79B9DA7F8BB4A73EF
+ 509409716FE59E0C9F72E3DEC73C5FEE424C12AD1A6C365E14927259CACE09C0
+ D8AA5D4E19CA34F74ADCAAB1E51021461D123FB8765589264DA08BCF5F72BE4E
+ 10AAA1471988D1E82B12422CC216E2E4470BE5B3D804E2C8A14A35295562C87B
+ 0ED837729143A45C9BA0FA438D5B68BECDBFEFA31460D3850CE54B41FEA8DFEB
+ F7F1A7C9A8BF03ACA079667AE235A758E5C9A37AB28F3AE3FDBAB76AEBBE7B7E
+ 3B91405401924F6E9EB91E04982627EDF68FD26E613ED250CEFB075765C2E86E
+ 38C5E3AA947DE0DA39183A09F58C0185D8F6AE76EFA0A8C41A55256FA3838406
+ E160882C068567636E964ED3EFF87105F68AC486270377C4B570CDF4247C28E3
+ 34774671A882665D740C400694826E9754F679EA3007A442EF179F738FB2E182
+ E2EF67A411EAF4307841A5ABB2EBDF3790510543FE0E6FFAED60331EA96D17DC
+ EF734BD076DBC41BC01483822BA048713938FACDF503A580168CBFF824433F1B
+ C1EA34BEF484B8BC95FE6A21FA636BAD34AE91167BFBB2438EF085F0B294FBEE
+ 34959A6B91DF7A82E8A9AA11C0060234E221BDC52D0D2F336D72D465FFBC5636
+ EB42E45087341A590ACA40AB2F7614541AD635ECD8E908338383380380E7BCC9
+ AA6D72D7BAFF984CF7F884CDEFBBA6EFDECDA511871808AB076E2097D15E0276
+ AA0B097806AE7D9171E93F6EDC6ACF6A40119DB5F64AF313DCCAACA46DB3E64E
+ 0881F1AF2898AEEDAA4A9AFBB3A24C7271C5DA9B05A4BD8C8D206874D483B832
+ F47B6D8C7A2FD120B43FB75F7AE3621F42212CC2325387960A37E05014F060EB
+ 2D33A5D518C8F69EF97E6B9A2BCA43376F354583784263E782D05936FEFC5218
+ E2352768B438D0529EC7830EA0387FC77F9960C188A2DB296244AFF1115DA8E5
+ B39D19D0EA1B1BFE0CA2E1B02AF37CD400ECFEAC03055AA61998BF07B6C0F06B
+ 29A94E287485E6E652329F38DAC877AA06BBA70BA564F5B16F5B9096D818880A
+ 1500A89B834587F253912AC55F1A70BCB0410D743B63699711E5252E46502C9D
+ 3CCF98AF85DB3B89DE5AB3DABF274C3A1225E683F27A2D0D28E43A1F679494A5
+ 385D18D1DA5507617BC194D473D54C27A9905C589F00F80C5FCF9F5082E1C067
+ E94526A9A7168C555956FEF1E8374127E26745AD6249A2585C8B83E546CE409B
+ 7E4B767B457A6F4A14E4FD34B613F93B907E49E5623E70B86B06FF8566FB2B1B
+ 74FB517792BA42F2D2F1B4B234118D306A49468809B5630854EAA748479FA397
+ 77C2E9545DF0AC4B9C66F44DADB1A53F361C20B130BBF69078BED68BB497EB61
+ FFAD51AA160059B923D2E3546F23C46C060F9BAAE8AF4E90EDE47121354E8E89
+ 5FD249EA1D922D80A4FFD37D5BAF406FA0E11B31B14E48A3FE291CC302D598A3
+ 9FCD893561FBEB0FA73B33420FDE3AEAE44792D98B94EC2C41201912AD16183B
+ E556F3F3E9C3F0A41CC2113CB8C35A84BE2C70E8456AC38A332A3BEBF581199E
+ 25A29034BED4D2C57A1731762D9F6B672A21F6A265B33999D504D2288639341A
+ 054988A037F73F7CB95342D40996F677714389E071603097B17912EA405B3DEE
+ EC6E719045850B404F7B24DE391C59F84C14FF96026085C428FB791C74917BAC
+ F12B23578ADE04270AB790F171A1D740C82135B4467B6DCDB833525DAC0D3D48
+ F36954006EDE6F94A8DCF01A57F3E019C9DC0DF1E1EE984E0EF1DB67EDD9FAE3
+ 86DA83DC039AD0E128FCC6C6A80F6F09DEA11A3A4A61A2E5B7AEE869E1DFEEBC
+ 8EC0201178BBD107662F4BC402DF289B4B40A5D3B69595762D58AED124EDAF99
+ C665B79A36D73473A0C291A4AEEE1F6FB1FD9A53100D23EF7A2DC9D8033CA919
+ 3B5A7E2CFC6DC4B162A120208179AD3B3168DC9ECECCC10B81EC3A9C536B2A81
+ 40DE5D3623210EB092FB5924339981E44B1B6198D875F421F2A77E648122BA48
+ A919A36AD41317C5A2531D7A5B00FD332AC7E60B1470B183FC59859851DC2A65
+ 878D6C025830DD7FD59A9855F98FADBA37467379043C9E8BABEC72CF6FAE1CB3
+ 0E10AD79606AB5D1EFFEAF75A5DF50A33270BD8723E71B58C8DA509C292FFF02
+ A2C623DCDB0B679642B8D9EAF91B988768EEE14EFC7C6A8B0A7B2FAD355E848B
+ 208BE353D48864B3255FDC4C625BC2759D73DD11429C33ABD695386A5B03098D
+ EBB02E9081B1B94C5E384C191068DFDD070C1CD3A319BB9E620BF4D69E1BACC2
+ 178AC549562699DB847C4FF61E1F21CCCAE13A0D5B68F568DDFD38D8244E3053
+ AF49B62D313DF7DE909D2020B63EDA601CF3DEBC8185CFE808870D004DBD7BB2
+ C11298E61CA27EAEA6B973D3A7636E68ED370E95FC4BAB32DF3D431F8F3D8F16
+ 1CEDB9A22CD93ED2DD6B2C99858BB3912C7156B54442395E82AB6B6FC5E87460
+ 85136638A6B012988880ADA78784241C248604768940D3AAD47C01CA722B3373
+ A2E79360E5763D6562EFD556CC831C208D0B00813FA13407B237CB7E4BE7B661
+ DA3DC5C6AE78C3F564EF56AEF786E47A156390A1C03A2E23BB497CFD4984F450
+ A7848CEE650815F7280F295B2D70AB36BB1EBC9E8DAE981C0EADF10C1079AD9C
+ C858783AAC36E8504DC854C77248D9A0B80FFA6A5740FAFD315C3340333D57FE
+ D9B77960147A6CF8FCF98D6B59F7C799B9FD473CCA05BC559E728B610913F7C7
+ D6D1BE16D307B0DBDFFBC7ED49C6DF887DD619EDEAF0BA4F12A9BCDDCEB9F73D
+ A8CF34E25183189EACD4DA70258D117E201CE334491DB96DB962D8835D5DE14D
+ 2748FF52E7EC157400E98150D1870E0720D48BF5CA9DF315E2814A4F35402C0F
+ A1172954DC7C14960FEBE46C56A2CB6E9E83C3D75D6D647BD494CC8FEA58A7B7
+ 6D4FD65DF3C44A91744B678D8F218E69C16AFBC80A53B3F2A9997C6DF910A985
+ 544B326306BAF7987C01173046C746E17003DF7A2E3F500F33F679E89495DB50
+ 350398791856447A32ABB40D299BC53AF53933D1FB844B72C2B2A6312B09B7F7
+ 480C05D5CBA02CF5CDB7C33FE774B7339D7C8F9C4DD41247AB44F76AF6E861B6
+ F2B6203CB0DFFE40E539B398A81D757F322716011EC5BA16907DAAB1CF7C93F0
+ E9EA33DCCEB5C2F6BF3B7682B020879A296A8D4041715581654DCF6BCB9F230C
+ 81032D6AC76396119AADDFDE75E0E299C9BFDDB36E9F255A6D0C87B7DFF05C36
+ 0261081D67E039CB1A84055C87BADD5303402978A7CC87D997D0A7A5A0B98160
+ 3AE4B129B4E76464F7AA4CDDEADF73C53ABB4BDEA5863D7D33FB9BF1A24CD9A3
+ 7113B8F8E599AD7A76A3560BC713A829A6E7B2EDE9FF92039CD50C50E94CEBCD
+ 596B3FE640BE1A1112684AA65AEABE7A29794024682EAC59E2E209C7DB8D6820
+ 7CB55C4530E3DBCEE65B6A147A67BB1EC84B4ADBE30D6DEEDBE0183513BAC0BE
+ 7F8AF036B002E7132EF64AB1A19FBE232592F3421AC9DFDF316E2A71DDC13689
+ E84A3F52BFE24AABF7CDBDE974D45C047535BF1A202F8C3EEC0EEB20708A17F6
+ 04C674C1391A02FD89FFDEB5E7E7A8D87A4F976565F7293BD65B2FBE2B78B079
+ C8FCC8B55625C27EC2E493C8A567CC7C7003CE6F714CFC051291EE884CC305E7
+ 77819FAB9FB7940984DDDD5F5C6E246A659FF68F6549F513F93C855658FA11F1
+ 859DEAADDEF02BC24C3F7596812D828F090FF3E1091185E4D748C6E0C0313B58
+ 3E790CFC61CFDC6E2EB92268C4DA69AD0BC9FAF87FC670190B90CDBE9A6E6CE3
+ F194734028388FDDD2587AD5C5FB011BB9DA23C974B05ED60A0A012F9A5C5CA7
+ 7E556661553807F47CD6A87904D97042CD9E97E3ED87EFD08F282FDB5BC663A2
+ 2EE0C20639E6B0D1DD62271E96BEB5E7BC7984CAE0E448ECD903627F690C1F08
+ 3CE9B9343AEA9247B6B977464C2A8228F3CBEFFBF767E2481D80F64AB5AC2E75
+ 36766125CD5AA6992459195A689EA5F9A745B61F3F99F7DC0F09BBCAC83F74B9
+ 19006200AC42573A3582D48BB729BAD07C81105D6F41C1EF33D6604E13C8E649
+ 6777415618F685F5FAA1F9734C28E139745F4FD92C57D2389B43E2536E93D090
+ FECB26BE4A95EC042E79EAB974015362696601A895E9743DBAB525A0F8926B0D
+ 7C77B9422F584498470A182123174EA68D08D7B5BA761BF14A17A7FDD441D3C6
+ 28663A0633BCB5BF735C7F0AD11D05B984BBFFF562CB4AC1B6BFA72B0422DAF8
+ 7D24ABF1560CEA8A78B90E3133A804F3AE2ACBB2050FAF141C9E0561FFEA0966
+ D119C7F41858B18987CE96363CEAFCEFBF09956AEB0EB44ABDEABC4D9435554B
+ 46F29202DE2E7AD45A4170638B43E2A44B014EE6E7C975364C558076D62B165C
+ 2B44716E05F4F3D989E1D6BE3F001A1B093825A63BBA029EFE234E5FFB94D732
+ 8DEF9FBBE5E62CFBDDD3BB45091660396AD61B7A24F610E902D213E1721C5398
+ A982C8EE862F1369003466CCA88BFAF17901DDD21E632B6405940E162B7CBEEF
+ A8F3D1A411A77FD80F69EA91816396EDA4616815E7B410AD827637E43AFEFD8A
+ A3AC37119FC0A095942711FB34875F301712299F3F93E2474C8A45E073442DF0
+ A666F46DF0721548AB589D4D495A43317CAE1F67C740B88E9780E2AABF7486A4
+ 201B277B9DB1E35515602F1CC003F392C6515A62FE3F106C02C26DEA4BD5A463
+ B8708CFDFD3B64BB79D262A96D3416F7C5DD4E8E6C87C2292A783ECCEDA8659D
+ D4C1BFEFC5F009F9CF158E7EA3FF1307EC574637B7C22528C927083161CA9146
+ 30E86B2F11636E71990E35FA26F43E1539DFEB444389A2DEFD41E00B8A5B5889
+ FCC1B1DE520CEDCD4C3327FB997B8C6982703EF83DC2E5C35D1476C0D3754732
+ 64136F5EE31ADE0493EA580C785EAF181EC545270EB7A30C873D369D5B64A034
+ 8A1FAB6E48FF6433ED5D8A44CC91683406ADB7C52CD7E5D738EF8E9E3DD290B2
+ 0101856BE8E22FDE7BB5A0A6EDEBA3E9DECC8573C65FE92278F3746716D72494
+ 58D1B0F07082B7D7B32A3B9B32A997B11D682FE942F6DC15EC4094D1651197CD
+ 786043787F465CB5B5107FE9CECC0448CEA354B32906C6A07436B05B287DA9DD
+ 1DC29DD5E6EAEA80B673FF6F7A815782093059E5694ABC419FE85AC6D35494B7
+ E195BD1978C10F3194686827ED4EFFCF9B24F1444B739982754493DC333430BB
+ 1D5B686B73E342C155009719EEDE5C0016B406C00606B523950A40E4327DB919
+ CC607122AF22E65BE80C429F8A0E9D63B8684B8D5DBC81D5EF2736FD36CA43EE
+ 030DA8ECD039578940D4B3F8E41E16579DD93C88F2FC95E29A3C3CA073D9E047
+ E647C328A2CB464613B34BD7C68422C964E8B014592DBFFB4C669DF10ED97F26
+ 317D234E84BF6DE673E07547EB9A76B040989090B30FA3BDFFEB7B301D3085ED
+ F7C913AC6281229CE2B162B075FDE95BCD7F8740B8FA7B83715C63B1CA6EEA56
+ BDB152199CF75BCEDDE656A49364246EA9ACFC7A1E95A46864A1ACEE20D8A2A9
+ 2E7D7AF33E8931CE7FE587F746BDB5F3FDEE0E27346EB755AB8361F6350D1457
+ BF84234F6BE443E586131FF27E5AB8B6FAC34ED59468D0C6B2D5E19BD51C0A9F
+ 5CFCC5F1878A86808C2A2FA6CC881DD64FA33BB2A776C87FF17411A356BE9FF1
+ 97B2586C4390F33627EB38CA48D14C428094AAAE368AFF888FC66C23D20DC418
+ 3969E25FCBE7B698828DC78C93F85D3B3EBD4DABE889E4FD9E985D978CE8882F
+ F365F56BC3D0F92A6D4D0DF3BDE5ED16E61BE2972A7AA74299CEB247363A8D13
+ D3B572F9029841AAC8CB3A28485E1FFD4E74A1108E726EFAF9A35FEEC202AB01
+ 28541C1FCDED32986163EF1D715B50494B0ACA419BF5081BC370F09DEC2A3537
+ 52D00621A326D36E231CE778A9B9E143A3EFD6008FA631CD9BA6C3B67B6A2262
+ 698931C5DA263EEB9C44AE02089084B6C0BEB8FBFF8675C2678B181456A2EB68
+ 7C447352942DE6B3021E95B5DF006E1E57AE28D8EFE0C29DA59209FD1785CBAB
+ 6B24E7778BF463E7E9703C8EC754A1A1012F49A0CE52AC2C4E2ADC533E8BC542
+ AA6345F011D79C63DD2E96FD415FD628BC32D31C42BE12D41118024134D325F6
+ 272A201A6D896052FB89EFF6AB18FB60C9E7647C4EBC2CB84D370E619639548E
+ 58019B167474031C5C0962BAC15CF7BE61E3BCB7F2A52D5FEA85B908FE100C04
+ 701E6B54EBDB524E751F0A302A324D78F736C177E0559045BA95095A71665665
+ D7766CD26969C07F5E88F0684A46D2C7AD1B9E3113D0CFA1FC6136BEBAFFEBB3
+ 893AB3B8538F4E74EE502D51D1A5078E5C9AB9E98417D5D08475A0186B50CA80
+ 5DB4F98B3334810F3CB0D2EA73DA94BEA2B1E41C1C318571903BC33BB516C497
+ 07E1EC708FDD9E50EAB59639424DD88935CE6F8C31712EE8BF48A3FE3FAE7755
+ 3396E92B0AEAECD6900B5F326B728D424FD62687C6811318D7CFF58EFA2A9C24
+ BE5A5950C29A51934460FFCD52697CA9A89B59F1ADA99DA4A1F21D20B0D0105B
+ AB8EF83ECD6A1B9C6DF4A5EA93E9380479CC97998207F92ECF54986D502FA024
+ B5EFC5BBFBBB9824044B9984A7DA08F2481CBE5D1DF4BE7215E16F0FCDE6DF39
+ 6FCCBD77DEF61FFAB08E2610C309377257144A2AD8B136BDEC8065B40762652E
+ 31176BD7DF5E21AB32DB7FD0A10C782883FC5C7EB9F16EB358FFA0812464910F
+ E98547B0562411C5FEEDB503FF4C1F7EF83D389AE01A7282FE41EEBC1C638A10
+ F72A4473A2DCC402F227A6D7A0F1C46A2D445359DA350B4487CB105DA3939CD1
+ 61F703E43DCE95B8CF9A3D563EB47AF9900364F8616BF9F3E0A22F04B26CAAA1
+ FAD3D1C99E46AAF3A1C6799772EF6DC26C33D369E543039C49B39129FD4D6836
+ 1ADEF1E2835F08419A48045ACB9183C1438DE74B50A0192F7A25053F9AF68A78
+ 72D13974BF26BD3945F5EABBCB150096BD0BF39A4D9A8FD14DB7025F6726E477
+ 8A4CEF395F01393AF7F58C27679612EBFC6A4DC0EAA1D2396604698CF13336FC
+ E39E34B84C346446D4BCB36A29CD6D599450E842B7EA42FD3C3740F53003C2AE
+ 01368EFCAD5B8C19363A678B9AEC7B60641DAE7B643CB2C88C81757FB8EC3D77
+ B8E18AF54E32477AAADE7E2B77D61C586054F6547942261FF4F6F297F102040F
+ 755923298C7DD39ECB2825DCBF88446724A2F0CD9F7AF416F807AF74E3C70B5C
+ F11D4C5BE0E61BF9A1CD9A3F1079EBAD910E7BF875CE89A7489214FFDFE46AC8
+ 2C53B0DA76A5434C3053EB68EAD681C7AA2411A3DC8042A55B1DD9E7E88D0FA6
+ 236C6CFC8EB1ABC6CC2C02C9E0BB00FEC3392F2FFF63DD402A9B6162FEDA6FF5
+ 592E6E5D2FC6E5C9EB06439E5F181772D9A3655AB736153D42C192A4AB88FC94
+ 6888118535D7DE59C4AAAF7D3F6B3C0D1F3FA727115D5834A9D791A78812B360
+ 5F67D2778D3ECC400101143D4F0C85BFC09E61278699F390671021624CE354D2
+ 6FB0B975789CC1CE332AA164A9A3B1601D403AF9688EC2FB14BF696D14FC9460
+ 3438F8EF0D5D76193DCBCD66FA2D0A7E10BE2C4658BA2155DC82A65D4528112F
+ 51D2DF6F486B6F74FBCA742BDA4E4FCF2CE771AA37A905B95957D54DA78B463E
+ 6AE1545E3D0BDFDBED754C34C5BD978BAF59D35E1FD687E5596DC2AAB6E68C19
+ 6D9148EC3AF5287DC7D77D2859F2489B00E318DDC736A3B32704CB62371D9A11
+ B7C3F3E8BAB8D3C39CA8F9CB3D032E6B6AA272CF660BF5F0AA2503E4B6620F9F
+ 93ACF9F38D40190B2314A78BF8960786B26177D2D5D6F1D55C2D619843ECB00B
+ FF7420DA5DEB6B2F18D41B84ED5AF30C7FF7355B8D598091D8CADBAB25AEBF77
+ 39ED64737C4D25A4F4DB7DF00999E60041A4582F4A162C55A43C7F63A8F4FF0A
+ B27A7E98F7AF974C7BE28533066AC6DBD1683C4A882DD49C2352BF9DA7B39837
+ 34D03FC9B71484BDD9DE3AFDB9B85E2063681BCFE2FEC77E6FC1DAA6F4045570
+ 7EFAA7E584C19EAE66875A8B701E81FE354B2CF79F32579B6A49C0790FBF8D0F
+ EE821B1DE1EC062F1326C83DCFB3F0626059A712516A3B14C2C8F2D72214B04B
+ 50C707477B55C03F51F6AF5E9642B772C8E687A2B1EEBF2F8083DAD90429F720
+ 962C110024384506EB61656CB3241193B5C9B005821BFAA5E46F0005A281DA7E
+ E04576606897B61C016D2B77B8481B2772F565696434F2BDFA26B082A7E6D4CC
+ EE62DF9046356D5F8A0FE74782C4CC8D7133D7FC1B5D39E4E6145EE4CCEAAB0F
+ 1063C932537AE481BF66F2559F6542DC7C735766FEF189841F37F46F0B07A960
+ 71EBD713A573D519AE94B4F93035834C223A875BF5132B5B4C9462C541A77B1C
+ EA01C4AC078AEF8E463943FA66D612037CB76A9887F6F207193524B5E1E5A85B
+ CA66AFB1A9B812FBF5CFA55D1F0F6CFAC26CFD53484E7D81D31E53BB94CAC5CC
+ 568A18ACBCDB5893A90AD0950D75C194FD2C5121276D1006B1C43040FB8D3D4F
+ 5A907D95395B53382087BAB21AF6FF83D78A804BAFEF00C57A7E2A8E5C5E5D04
+ 3CD46CBD6CB22B4A77B61B1E5C8086057F90D908579D04D04CB0960E3CCC093E
+ F6D0C01E2A2438A7726CD2519EC1DD43E9DAA33DC0299D2C7FD9A368D346B8AA
+ FF1EDA2F3DEBEEA2EDEDB8D441454A69A8338E81E125330924BFF168E877C913
+ 84A44375A6A59B96F9921F4D5AD527D36D7F377FF2D164B33D839B2EA7ABF221
+ 4DB582E66D186073D8223B5C8F6E13B3FF0A30C71D2891AA3AB775362A492E43
+ F4654344D9C1AE6216D269B4BED78119100864B0C02B15877F5CEA18B88E28E9
+ 15BC86CE328AD0BBA335C649431F253FFD98646A21035822092765A5278BA757
+ 64C9FA40D6FD942E750BAC922145EA32156D47FCFA706D066280A8484B1E91C1
+ B8E7389888A23EA3F8664C3EE61B728386C969E31E6062C9F289089E53E3B546
+ 2ABDA0B01C04F5A48F7484B14480638A826B526935F65ED5839F4BB47C11A5CF
+ 6BCF01DD84DB75EC782934AEC675B6CAA627D90DBD4A4762935448AC58E96BC2
+ 9FB9854AF81407EF479C88E72076E1EE57E3D2A6150C9E05FD3FE10CEDA15598
+ FFD5FE72FC48B29501B466EDC6EBDD439BAD9D8C1E406DCD63B0B7CBBE692BBF
+ 02B28109B1E04CF7DE63C5987FFF86F555D0A25E80D57FCB83874F592AE9F151
+ 376D99334B6A45269B0BAC8422860006B169EF2195F0E6F878D1D4CA50059513
+ 00F1A94FFFE4081BA50A92874B1013AA004F921EBFDD8972264E981574B822F7
+ 2417BEF9AEA160C56619F3266AD96FE06F39120784F5BD80C2F520A648AF8DC2
+ 1640E5178DFC7239A1B65B9D8C4660C4076D9C02A19541C9DE47AC697B8491E1
+ 911535BE527886B51E4BB0113E8FD2A64B2711F8A6818850799D457E6FE0C928
+ E18C7A1F3DF2444049711EABF6AF60FFBF92A159503B919E605E76FB3FAC89D2
+ 9D6FC985C5EA667F8ABFF293DBD11280A3E8EDE8A46F6D92D48AD171BB6EFC98
+ 1689504DB71708D919E5195C99B2F3421FA50BEB143B5F3C660B4AB869172681
+ 9D603DCE1C8A7ECA8DBB9CB4A443C417350D14E106D2FBECC04178A23AF2FD1F
+ 660A7434E43769BE89C75A544D8E3912C174BEF56F9230B2C5BDCAEAF60F10EA
+ F44635B054097A6AE1B3B12619F559F07612CFD172B460173CE4CC18EE88F562
+ 494F7BB57672EE1B51A42110F5C8581AA40757ECB39CFBE9061DA22E0FEA84AE
+ 60FC96F92C223C5B28B5814FA246C50EBE75FA47E1D2C13B0F52BA2C74326B8F
+ 2BAD42E168217F60C159324BCE12181E8FE4D5D11E6FBC201E344900B54394A0
+ 1116918B5A8428D45021F9B99009E53A5B09900085A2159E7D1CE1B34D2FCA35
+ 8A2E8EB1457AADABC6C896C696378A0FFA02DE82A6D8D842409A520DC8CD7482
+ 5565A6AC5D1AE93FBB09C1B06CEA5115D873AA21F7B7E1D9A66B320E26FEEF1D
+ D31C768656412ACBC0150935863955B71EDD8283958A53110922C88198D306DD
+ AAE7D18FF14AF73A60234BEC6F05D2D7095A57C46850C9F9B782F255D8190D83
+ 719A8DF1248597D280EB8F33B01BC110FDD8A4C913F36DB729E31E768F5AD1D2
+ 65A0A3B13A25F04CE22477E327457EF54D4068E63E0423F3967F31CD0A7F9060
+ DF6922C843C6F7A4C7356B1573B99697CE8CA1290BF5C3FBEF08E37E7E731088
+ C425857E6343E02EE79CE17D0A5473DB7BE00586989F239307C70E5AC7DF7DB5
+ D8A868DC8D2A7400996AAA245124B7B446A802D5CB88C25292713F3FD3A3E9F5
+ 4A6D7242B663619B69495025165705F34DCF1D0F77350F4B18412072958AB7E8
+ 167CC13D9F886F57E15EAC57B68C10C3F1A282325F823B36A45B152CF11103FC
+ EE0889061EA1479F83CD2CCB1C1BD628F802C76952F4D0B8AD19F937AB2BEA8E
+ C72A824EC1ADA661C60A65D3BBB20E9D31D5EDFC3D76ED55B6AC0D66A5B92212
+ D4001F8B23C0D21152795CEC56C011295278DF8200F15661AD45E4DFFD72279F
+ FB101284F18AF8D6DE41EB10434B520F09B749170836D1E5B856E258CD5AD8AC
+ 544A66C723459252F25FD8DB60844853F2714305F83F0BC9248B42EDE9EF122F
+ 63F0D0363C456CD31FFAE9F46BE96B985020B2FCC6A45FCC6783ABED9BC9305B
+ 506145E39679D73AE210AE34A5114BBA173DD2687A80109BA970F0383DFD77C0
+ 86AABC65D4ECFE53849B522CBA0C1C675657E320541BE652EEA51CEB951CAA89
+ 27C312422113F4FDC834D05F76920907ABDA7BE1BCAD76A63FF75D1D1E12F93E
+ B6312431EA4EB3F42E89CD00163320F6FFEAFFA1385E29D4792B2B64DDF65C27
+ 49FBC3D726E13C9FFE15CF2CD0730583A82BA1EE46C593BB0AB03DCE565B0ACA
+ 4313C1528DFD323EF9DE816227984BE43370B9FEADFB4FECE55CB262C8F52329
+ DD3B6F751E80E442FA22FD928D3016254414D8668F9FC2D70FD253493C8EC915
+ 175D3626700C8FF1095A904CA49A6254BA6226FDDE75CD34B09625B6F20AAA54
+ 5C3E4BF0399F4A84F875FC085E3D85F8791FB2D32C0A32F118AA3E37C5914382
+ 1F641EADF6CF001AE2089E0CF3CFFF5F313EF4C88521827211F8D1261FFE8B1C
+ 2665C0F3C7F6E3676DCF07F20FAFE88124FFC4D39E17EAE771ED72DEBB897E8F
+ 09CB50BF488A645E4CEA19E4F0C336E8903D375C170F158CA15D8E201905C5FA
+ 5797CA0679C080A78BAD847F5087BC031EA36BA8DE92D40468D2410ABA3358BD
+ 6A0916575015BAF85E840CF94B5AC8984F3886E282851773BD1A1605813D86A7
+ 8583B6CE5512DBB5F23D0BDF37A1A760CF9FCF4F57658081AD5359FA02945FD0
+ 6863B791B274F1F8123A73C3C98F68C2A466B9894EAC5DE1B611D95638B42FFE
+ 620EDEFA266EDEFA770BA2FD37D71E0FBAEC369949771CE6F780B51948811A7A
+ 7DEE58A45A899A1F7C73A8DF3D3A1708765178DF8693AD20673FA29563D85CEC
+ C375EDBD8D33F2ADD104CC6C3F54A6AC2DCD9EA399E4F88837A51D492167639D
+ 134A97E25D0C890CBAADE7100BAB50872BA03633AEA7FEAE4D2780986EBEF394
+ B867154B03EEDFC8DCC1634B487C8BBFB5CD0ED68B93029CF932551A9F9ADC19
+ 5C90EF70593AD34F9314316D253049F65C0A8181C11428AEE46373D0224E1ACA
+ 54706F7DF4CF6BF0DF193A0A80AFFD8B1575015132CB56BB755E8121C051B000
+ 521841EDF0E6AF26DB57314ACDB9B31F835A27BDCC247CD2961E1079E4C69857
+ 2BA028862344B1A351289D1648528DEA0D4599E64375DB4C2B37B832D29FA9A8
+ F949C8E72D1D1C642A49A2C7801BE0D583975639C63E8F45B3E886CA8A87F6C2
+ 83D7640BA3230ABB8B30E72DE41AF5C58D97D183914091DE2C3238D0FA1365CC
+ 607E9734320804FAD45122F9455FEAF4DD1B5B5F328E32119B39D93E521D366A
+ B523630524D5861D01BC4B8985C5DF86735FACE85E55199EBF0BB83E87317258
+ E27444278034ABFC785F9277199B7E4A9CEBACAD1E8A2B19BFDD860C5E194FD4
+ 38878D4D037C02E2DF53477E336463E1DF3DF07E133E022E7AA3E6D39C676544
+ 0196C86AFE74C1ED8C7640922EBBDCAC82333AF422C1483D9ABF8DCC3F55C9AF
+ D3BE0C9CCA7D22593FA72654AEE54E8BD0A10F02BE1104E2B778E2E3D8079D90
+ 49E25C4F0056DFD2EFC66369AADBEC2EF14D6139A3C67AC3075B023A3A4C23D1
+ ED719C49075FF2B63E54F338EAF328FD0E92022CE7ED0FE4D5471B7A1447B547
+ 329197976D534C2FD4558D5D555F1DACD23B34A304CC35C59B088ABB9974D53C
+ 9536A02E4BA6D909A8AF24021CC4BC61B891E41E96F211904A50C5123569547C
+ 5C564A4BA3D78B1F2909ECE4E5609D05BF1E6C4D2CBD11F2813BB09BDB08D43C
+ DD96DD7E88A5AA56D4826F171546C39A07A124F57ABAD8C59C15EC83567ACD8A
+ 17A4DB5EBA59842C02D5F064E6BDB891DDA0B5F7EB00C44BD3B66EA445AC0EFD
+ 2EE5204A255C7DE6370A07C0E6C61B0FDF6DC3210C214B5DDA2B28A19EC2BCF2
+ 93C9F4015965DFB688884CA76B83BF12A8AA68ACC102128A0A63858D6608817F
+ 91B397627F7ACD00989EC1F10485864C4C2E389578EB0BC64DE05E9E221D70E9
+ 9842035EAE98FE4C65B1A87173FF22A0DFEC551EF5BAEF79F75380FFA30F43FE
+ 5A1F272E4955B6DA9F93FBB01187B27472C4F5B6F118D8862A66933A24AA1044
+ 4A49EC37F711E6A784A416BB81
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMITT10
+ %!PS-AdobeFont-1.1: CMITT10 1.0
+ %%CreationDate: 1991 Aug 18 17:48:50
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMITT10) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle -14.04 def
+ /isFixedPitch true def
+ end readonly def
+ /FontName /CMITT10 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 101 /e put
+ dup 112 /p put
+ dup 116 /t put
+ dup 121 /y put
+ readonly def
+ /FontBBox{11 -233 669 696}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+ 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+ 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+ B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+ 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+ D919C2DDD26BDC0D99398B9F4D004D606918A40B8D7BFA821B73E118040992A4
+ E1BF99740F8FAA47E4349853C8149C0F8BE2F23C6F332BC0373C867D0715E8FA
+ FF163A60AFD0FED665D5829739975C5DE12EB30895604D211F645D4E13330DB7
+ 64B6E35463C93B752F691FDDC44595B0A0E9E57C6F649809C4DBC7DB58102A60
+ 46349E9A5740893A1BD4536B99ECE72B147B713619037400669C07291022F84F
+ 4F3302F8244D2F0F1380466E81E0B5E00AF33E021A55620A7A93F3BD49C7040A
+ 67C096167F502EF2051B526405B9391B4340A3FFEC103E317E315A88D31661E1
+ 7E4104A2B925D1DDA9586861904FF6FFCE6A8E808385E4C4014F5A494874E2FB
+ C3758D6989AB68C4CEF82F92B9439794FC404A29D086ED6B27997735BC3A24F0
+ 473FFD74BAECF5282E2EBFCB92D69B81C568D394055E2E30A7E3F448796E4EB8
+ 019AC2E075377F777183BD87FDD194E855ABFA35AFA73304DBB181C267431B16
+ 70456FD8470B525011891C1E140B8FF24A474B89F1CEAAB509F91FCAF512E16D
+ 8413BAC0C664FDCD31245C5996F4883305D3EDF1C8D1E6F0B1E79A06028BBDDF
+ 6AA5B515DF33BA8FFF2394262F3FE1DF95AD661322BFA5179E325BD1B1EECE49
+ 69F64789FF1BE8DE5CD7485571A07471BD6CAB4891BAB122BE4C4A1B7176F33E
+ A1A434F745811B71EA8AF73407F32E9F4EAAE1C1FAA979523C18A24F754C307C
+ CE056DCB71B20292D4FBCBF9AB9E9B81DADAB90E60BE926315049E5BF0F50315
+ 66D82E4963CB556F19461F43EF80302912AC1168884A1692AC59BFBC431B14AC
+ A5FC06C4AB595F9DF66CE5EB69568038445A9EDDE20CF92BA308A235A872B15E
+ 8EE6356F4041C28B24C085EF70B6626241A3AD73D4DD274D5B7A4C0BCA80F121
+ 957D0E504B12C2484E2B7DFF711F704995A9AD468B796B294473D338BB8C8B76
+ E53D7C1D6A92F0B332F505A7FCECEA75BAAE4C92ED1397FAB77F6F69A2D42568
+ 52D623D1AC829D0B2F8642868CFCED6F86EAAE43C1C63F61E3FCFF126CDE44FD
+ 6BF01F8482B9CF1D0314714E91338BB4E6EA1ACA6492AF6AE6C06843E097D24C
+ 58E56D593B06EDEEF7EE67580E12C56F4864E82E695F36EFD7994279BEA7DB23
+ 9FB1233C13B431E4F635773B95DE3CBED208F23C6438D11BFCD53ED7D5729D94
+ 041A3F335433F1133CBC08D2BF20CDF11A0260107D3BEE61DA885174B857E004
+ FCDBA83E6AFE7402A8CD877D4E27E19ED64E33BBA1778734617B1A3DDDAD0567
+ 2F2F62EE5F3A3FE42339FAB24C3FB5FF14014E48685D42B9F90778D17B37858F
+ 054571505F374FB3F555B52744079428CDA68F1545930C7DB7E1A445E377CA7E
+ 52C626F0B937A58ACB848017B2B314644F02A8AA161D89DCBB6F635918E16617
+ FFBB21C9C32CF0C0D56DB3AA7B8FF877075F4D082B0E773A7E948E62B46EEF02
+ 3C6AE396CB348E796FA4D8DED175A3C3E2B45472CE234B25AF8439C811D1E2B4
+ 598F4BBB7FE866C55BCC8B910A7EC4496CA6A5351C5C432CC4B41A49B7ABE305
+ C7103DE7D32AB13C0811AE8D2A348FD9663DB21EED4BB174992D807BB526A5A6
+ 1B07776263573616BCBBB050047F72BF772185A4DF4A191B69F69104F8A87193
+ 9239BAF696BAF74DE2913439FD159805C18569E537D1926A873969FF738FA1BD
+ A82AAA4CE46F41AFF1EE4A294530447E7AC9A581162E6A00A024EB67EE126A23
+ 3CBC806316A3496CA6BC44A824D91DDCC348709FC4EB028D92A47074CF2FB889
+ A161425C354DB2F1445A1659BB410EB100D5D96D4480AE37565EA4B52FE18347
+ C9D1519C76A4C657709E30074C512069B747D56F5DDC11528AF703B63BE3EC26
+ 81A983C0C2FC601FEA4D7784A8069E21B03FE63FAAE988C6D4E8700D215E4854
+ B292C1D1FFC5D7938601D8D9D903A0ABFDE8A3572EF5EE092FE21193D146C41F
+ B07273556ECB3871730BE4E26B68C1517B659E9827BAC29B02906CF842BA950F
+ B946665707CE509DB3B6427ABF01D9D8C5784EE61B746330
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMMI8
+ %!PS-AdobeFont-1.1: CMMI8 1.100
+ %%CreationDate: 1996 Jul 23 07:53:54
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.100) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMMI8) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle -14.04 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMMI8 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 110 /n put
+ readonly def
+ /FontBBox{-24 -250 1110 750}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+ 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+ 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+ B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+ 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+ D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5
+ 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC
+ 4391C9DF440285B8FC159D0E98D4258FC57892DDF753642CD526A96ACEDA4120
+ 788F22B1D09F149794E66DD1AC2C2B3BC6FEC59D626F427CD5AE9C54C7F78F62
+ C36F49B3C2E5E62AFB56DCEE87445A12A942C14AE618D1FE1B11A9CF9FAA1F32
+ 617B598CE5058715EF3051E228F72F651040AD99A741F247C68007E68C84E9D1
+ D0BF99AA5D777D88A7D3CED2EA67F4AE61E8BC0495E7DA382E82DDB2B009DD63
+ 532C74E3BE5EC555A014BCBB6AB31B8286D7712E0E926F8696830672B8214E9B
+ 5D0740C16ADF0AFD47C4938F373575C6CA91E46D88DE24E682DEC44B57EA8AF8
+ 4E57D45646073250D82C4B50CBBB0B369932618301F3D4186277103B53B3C9E6
+ DB42D6B30115F67B9D078220D5752644930643BDF9FACF684EBE13E39B65055E
+ B1BD054C324962025EC79E1D155936FE32D9F2224353F2A46C3558EF216F6BB2
+ A304BAF752BEEC36C4440B556AEFECF454BA7CBBA7537BCB10EBC21047333A89
+ 8936419D857CD9F59EBA20B0A3D9BA4A0D3395336B4CDA4BA6451B6E4D1370FA
+ D9BDABB7F271BC1C6C48D9DF1E5A6FAE788F5609DE3C48D47A67097C547D9817
+ AD3A7CCE2B771843D69F860DA4059A71494281C0AD8D4BAB3F67BB6739723C04
+ AE05F9E35B2B2CB9C7874C114F57A185C8563C0DCCA93F8096384D71A2994748
+ A3C7C8B8AF54961A8838AD279441D9A5EB6C1FE26C98BD025F353124DA68A827
+ AE2AF8D25CA48031C242AA433EEEBB8ABA4B96821786C38BACB5F58C3D5DA011
+ 85B385124C2B6534F3CD1866AF92009D93B97F763AA3CF46C60636D7FC1564CF
+ 1DDFBC12CA37D27A79B11F2AFF2D70DBEE03CF1DFA5B864A2DC22266E4FA43DC
+ 3F2CC229231F1F72874E6A74A90E8003B9AF1BFAA55C071FDDE5C94E4AE3C5BF
+ 936EDFD4164624881410AB9EF0593F823D40BA7D059992104D08E41EBAD8F276
+ A84EE2C9AEBC7CCB72AA6B6E6FE52293DC7BC34C2D1B69418392608FC5920291
+ 733654FA401E05F3E647B1C6AF4BECC3E802F9963344B05EC3DE8C774293CDB4
+ 3F057D6F258BD341848FA7FDCFD4D1923FCAB51FA8ADAE6D9F19C1FFA6EB5E9F
+ ECF844CEC6C1320D3F00C7259EF5812526F58248C61F89A42D9C9288CA8076FA
+ 77E1C950940D8D6A7D852A0D0ABEBF2EDEDCDF6DDE0C8CCAC8DA9B28207D9CF8
+ 46446E1153D8D8795EE914B12349137D4BE461BCF5A6A3CF15FA5B9E91EB9B90
+ 0483916D0CD40EDC29EB0B996B16462A64F3B19B57802D9AFE3F1D91D9A8553C
+ 531EB8B4E975037ED620EED3020388BFE705958B1E3AD4638B9CC8644C2F4024
+ 5DACD97151C3DF7A448CC3
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMSY10
+ %!PS-AdobeFont-1.1: CMSY10 1.0
+ %%CreationDate: 1991 Aug 15 07:20:57
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMSY10) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle -14.035 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMSY10 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 15 /bullet put
+ dup 32 /arrowleft put
+ dup 102 /braceleft put
+ dup 103 /braceright put
+ readonly def
+ /FontBBox{-29 -960 1116 775}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964
+ 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4
+ A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85
+ E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A
+ 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A
+ 27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF
+ 5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09
+ 0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730
+ DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A
+ 71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09
+ 4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C
+ 515DB70A8D4F6146FE068DC1E5DE8BC57030ACE57A0A31C99BEDB251A0ECAD78
+ 253AB321023D15FF7F55A3CE81514C1E7E76240C1FB36CD4874DDB761CC325F5
+ D588700B294849D690F93526EF438A42B9B5B0508584EA3766D35F5B8D51C458
+ ECB9FBD23A4A81F55A82F06621BF584C1717AF88B76BEED8CB031423DADAAB95
+ DEC610063D014DBD78BB0FA0699BBB5D3799867A7CFB9F5C34155617102AAB23
+ 3E4D0062E70596FFAD7B3E6BDF575D90AF573FC0D41E161EBF02619CB8C7B31E
+ 0FCD68A6EDD049AD899CDD867F0060838EE3F8FE1D3406CE29D7B91CDD01121C
+ 1847D58D23A9754104AAA45D4E6D0DE1325FC6E215120702185CB3839D58722A
+ 8339AC5484CB21500210BD3FECA95A437F2A18DE2B8D0B70B675101F51510545
+ F294E807DECB64DC608160DF38B61E5ABF1578FB31C627C92AC31E0D86AE68C4
+ B3C133ED939E6D26FE1EE6F13336BB8B3C69E86AA8867E1261730CD3FCBC61D5
+ 65665D91616A413FCE7DE2BC9AD4C6A7CD20D866589F7896F26E8D10AC7FE78E
+ C929CFD56FEA4962DB4E96A96F6DB3ABD4C2A0818AD705F0D4558B985447BC78
+ A10A7CBE81456824395BD345B3C0BC4DDDE9C577315A7A8C5EFCCA320DE62241
+ 7FA45252B47B70B25B8F445C377DB4C71C74299CDC798D725DA32E653CC104BC
+ 31514DA89F92457C59F1724D16CB4689980B23EF9884A9DD7B4DB4682069B63B
+ A3776EBFF52662E21414B4974C7F0945B5E35D9FBBC1AFD62D811F80226632B0
+ FB47DC3E41D51F9BC88C0F264AFA751FB6635B95CD29844BEED5150CC3128177
+ E1B92C56909D907898B6A6FC126EB3A7827F2D99880E004AA33EF65FF1A55226
+ 179EE22837147838EF3DC149498B2D50DC9975B888F7364832F62CFB94CA9182
+ BB5E1590968FD16CE930824218BC80DE826E6BF8504EF6A2DB70EFFFE2E16A6A
+ 51707E389EC6C6195C16A303D63BAE66F7189E9B3F87812C5E991D0904EBAF1A
+ B816104F7BC633921B9411AC41EFD8DD78E93B353D2FD1844AB38BBA
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMR8
+ %!PS-AdobeFont-1.1: CMR8 1.0
+ %%CreationDate: 1991 Aug 20 16:39:40
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMR8) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMR8 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 43 /plus put
+ dup 49 /one put
+ dup 50 /two put
+ readonly def
+ /FontBBox{-36 -250 1070 750}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C
+ 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361
+ 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA1772CE422BB1D7283AD675B65
+ 48A7EA0069A883EC1DAA3E1F9ECE7586D6CF0A128CD557C7E5D7AA3EA97EBAD3
+ 9619D1BFCF4A6D64768741EDEA0A5B0EFBBF347CDCBE2E03D756967A16B613DB
+ 0FC45FA2A3312E0C46A5FD0466AB097C58FFEEC40601B8395E52775D0AFCD7DB
+ 8AB317333110531E5C44A4CB4B5ACD571A1A60960B15E450948A5EEA14DD330F
+ EA209265DB8E1A1FC80DCD3860323FD26C113B041A88C88A21655878680A4466
+ FA10403D24BB97152A49B842C180E4D258C9D48F21D057782D90623116830BA3
+ 9902B3C5F2F2DD01433B0D7099C07DBDE268D0FFED5169BCD03D48B2F058AD62
+ D8678C626DC7A3F352152C99BA963EF95F8AD11DB8B0D351210A17E4C2C55AD8
+ 9EB64172935D3C20A398F3EEEEC31551966A7438EF3FEE422C6D4E05337620D5
+ ACC7B52BED984BFAAD36EF9D20748B05D07BE4414A63975125D272FAD83F76E6
+ 10FFF8363014BE526D580873C5A42B70FA911EC7B86905F13AFE55EB0273F582
+ 83158793B8CC296B8DE1DCCF1250FD57CB0E035C7EDA3B0092ED940D37A05493
+ 2EC54E09B984FCA4AB7D2EA182BCF1263AA244B07EC0EA901C077A059F709F30
+ 4384CB5FA748F2054FAD9A7A43D4EA427918BD414F766531136B60C3477C6632
+ BEFE3897B58C19276A301926C2AEF2756B367319772C9B201C49B4D935A8267B
+ 041D6F1783B6AEA4DAC4F5B3507D7032AA640AAB12E343A4E9BDCF419C04A721
+ 3888B25AF4E293AACED9A6BDC78E61DA1C424C6503CC1885F762BFD4563ABA4F
+ D926227FAD2B2D4975835541F5A97E7A70F5CB40266CB9B4E609B94B31263442
+ 35FBADB202B4032E1C3165F83176413544AECC056C371F4B41C04121C4D20A7A
+ CE519F46C3999F58F5F43BF799D624FDF62A229D8B9189CF5AFAE6141FF16B53
+ BB2B3EE9FB2467181C50CD8F8F32BC6609385D9D111EE2A589687D84C6C2FB75
+ A48CDD9A85F106AB9D3F906105C56CD993793C20FC7E5202428340F3DD4F10DB
+ 561A3958B4CD377D1B833D27F6F9F233CB9D99F95309D20134DD6A47A5291D43
+ E49BF013864BA87ED38FB9755A8077105EDF397023D0C1A1B21B951AB1A4FFA2
+ 72990283B3B455447DA9E68C7CE660F8BCC18F5FD82371D89BBB363EA0FDA552
+ 3059558108DEC9D2E6BED7BDD5C0243485F642DAF3B3A719E098D25B24E2D1F7
+ 9B9DE8CAD714415F9DC0F0A7BF618BE0FBD81618CAA161548B2038163020318F
+ 18C088D44BEFB4397412661EA87CE38799B3AAEE28A008A3FF638C665DE01D88
+ 1604BA57E90D82855317F1A99B9C6FE3E6B46F5EEC32DAA013BB124E6701FDBB
+ 821E8527C2BD04E8D9770BB5037793DC4DFE6CBFB2F0850B29BE67083451B071
+ 413B07804AD37CA3AAD6D799091E5ABB2F5C55FDD77C4E421D4070EAB055C3CD
+ 4DF259F039687CD598BCCA951367BD9CACFFA93F12F96BB0211EED9DF6276E2C
+ E2469BDFE697A61CB583EBB9CABE24568FB504C42AF29F9F90739AEF6412A1FE
+ C3B3B587A034F1
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMMI12
+ %!PS-AdobeFont-1.1: CMMI12 1.100
+ %%CreationDate: 1996 Jul 27 08:57:55
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.100) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMMI12) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle -14.04 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMMI12 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 30 /phi put
+ dup 58 /period put
+ dup 59 /comma put
+ dup 60 /less put
+ dup 97 /a put
+ dup 98 /b put
+ dup 105 /i put
+ dup 110 /n put
+ dup 120 /x put
+ dup 121 /y put
+ readonly def
+ /FontBBox{-30 -250 1026 750}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+ 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+ 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+ B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+ 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+ D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5
+ 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC
+ 4391C9DF440285B8FC159D0E98D4258FC57892DCC57F7903449E07914FBE9E67
+ 3C15C2153C061EB541F66C11E7EE77D5D77C0B11E1AC55101DA976CCACAB6993
+ EED1406FBB7FF30EAC9E90B90B2AF4EC7C273CA32F11A5C1426FF641B4A2FB2F
+ 4E68635C93DB835737567FAF8471CBC05078DCD4E40E25A2F4E5AF46C234CF59
+ 2A1CE8F39E1BA1B2A594355637E474167EAD4D97D51AF0A899B44387E1FD933A
+ 323AFDA6BA740534A510B4705C0A15647AFBF3E53A82BF320DD96753639BE49C
+ 2F79A1988863EF977B800C9DB5B42039C23EB86953713F730E03EA22FF7BB2C1
+ D97D33FD77B1BDCC2A60B12CF7805CFC90C5B914C0F30A673DF9587F93E47CEA
+ 5932DD1930560C4F0D97547BCD805D6D854455B13A4D7382A22F562D7C55041F
+ 0FD294BDAA1834820F894265A667E5C97D95FF152531EF97258F56374502865D
+ A1E7C0C5FB7C6FB7D3C43FEB3431095A59FBF6F61CEC6D6DEE09F4EB0FD70D77
+ 2A8B0A4984C6120293F6B947944BE23259F6EB64303D627353163B6505FC8A60
+ 00681F7A3968B6CBB49E0420A691258F5E7B07B417157803FCBE9B9FB1F80FD8
+ CA0A265B570BA294792DD2FC75CE2C83DCC225B902551DBD11E687EAC6E85D2B
+ 02C28359A40AE66A6A6A8862CB17815B41E280313F0EFAA9981755611F7F683D
+ 35603984D60BB0C772054355A97A5E03C689E23B04DA79080CE4579CC90EF38B
+ 1A64CDD92B907AE83192C3C46C5FC40BB412F6656DC6349E6D29B5936DCE94CB
+ 98E3B465FFF7574095F57BB3750F1A55F20456933FCA64CC1B060E260782BEF6
+ 721D38BF65DF1F1DA5439DBC802B4A9D803BD635C05B9ACA4D26C28195A1F4C4
+ CC623B30B076D4861E89B93E2CF26F6DF07199C03BA5466FA3EFBD7F77EFE068
+ E55B7186855063934C5716EDC3F5056BDA963B6B933B546475BCFF91C512F411
+ 8D14B1C32C9735281E536F87ADBF1AD9AA04D7DE2096413AB8B3C9E8B1F6F338
+ 3B80D637D761A7A992CF58188FB0A04FD6C6886A60F27EF31C45E92F4717D8FB
+ D4A0844A8D9036D5F2BBCA2C170F3042F22DEB8D151C7135AB91DA289886604B
+ 70B9F2A25A7D576FA1D70DC935CDD3E81915E9BE11CB03C9FDCFDE3700BDDAAE
+ D61CD52A78B075FF4FB8BE949FCC4B04813776A3451FE65A47D57D7B66499E99
+ B97C5141D2E05BA86C59535C34BA975381F96A4EC47EA032C6BEEF9F2E6565A0
+ 0712528976CD8FD94E2F8F2607FEE1B55382A62B35FA16C62707F805DDD68FAF
+ F18133F16F5D312246BE70BD7BDE367A314CDE17E9E69A7D63DE373262D397EF
+ 45C542582B6F56F890EC5EE8DD9D075383DAB8FB7A9F111BABBB8C52EA764237
+ BB66DD71D1AE8253B62B760DF589FB2A1EFC7012142611205589FA4C2263FAF8
+ 31B150E964FB49C0899A9FF862A4DED7EEF9D6D3DFC472576307A8DC809B6620
+ C88AC1B10B7BFACC1EFAFD38D3EDDB3E1A341AF31E0DD72AA1D6735F23ED2BF6
+ 3A091BDA83CA7D1FC1A124D3C9624699D76D7351A4A78FC2B506F8A6798B274B
+ 84C99DD186ABE4DF6BE93E260F9FADE88399CDF4A06BC71B8C4409385E2D6043
+ 7EFB9C2EEA1DD84D36DD07B023C872DE6CBEDC4ABE75AF0516EF9344ABC2DFD6
+ 7B4DADA727B8A442D650FA720E86EB4CA627A0A59116F5FF1F95AB2FC4F299FC
+ 03D49B22BED974852B206F88EC9AA95201EC771E406A663BC935A67F4D299496
+ A224B7734AB7E7AE516413704EA012C4B0FAF944039691400EEE74C7357BD781
+ 12B6B09688A1AA4A7DCC5E78FA932E224D5EE06C7EA40186133BAEA9EC247C99
+ 53297EBE63BEB61BB1E7F99C912C44AFEBB5DE375C26ECB81DE54223C9929EF7
+ 3C2D7B1FFF5BD1ABC0FD23A0D40F7F7B292A418A8F4DFCF697084FA2DC165F36
+ 2F68FE518A6064175EDF884739DF60D1C2D1287C50D510C0A182E42DBCA47F9C
+ 4A5202DFA349F802FECA28916D34C2440C46CC9CD6F92150DAFD5B90327012A9
+ 8BE35631A6CA673C349CE8AFE1E5840DE663EB244E7399787825B07040970B48
+ D52E597C959639CC6EA0BC2579D8C44FFC5E9AF212C80BB0897D475FDBB70E13
+ 3E587ED6A4CA371D307D10CAA0E1195BCD2A0BF0B453C70EF581CA58E104E32B
+ 7FAFA0797385433EAB43126ABE49D1315794A6A7C5EE2D8F051C68FC093D49D7
+ E5356F991B754CA5432BB12729E3E98734CF7F1BC7A0ECFDBB8BB5DDF4C43AA7
+ 245304F1441A503C18BCBC6BBC9DACDFF3043D975C950F92E4733E60909EE94D
+ 60FD56205E48F874E4DB08E4E49E8DE95382D618B180F05C9C114E1C0C79E1F7
+ D8C8E2A172481FBEE6DC709D578348C16665B409AC0ED16F7678A54F049ECB0A
+ CF1399D18507F750541D9734231A55EF10C8653671D1B4BA6481A5546A75D80F
+ C7B04D02787AE1F44D30FF551D280383680B0F5A5DF3EC84C7BDF769A604BC5E
+ 171FDDE45D8FC1F26FC89F73347334D8A5F044E8EB4B43D52972DF4787E390C1
+ D350C68E5DF98D5B3E2DB44DD90C706446EA2FEEFB9A46C2FFDFC14D24C8D2C5
+ 08D1789204C1F38EA04EF84B2412FC45E9A0AA71AA98AF3A0FC8F2C5F7339859
+ 6AAFF3A6522AAFB2576E75D4FD27192C650E64CBEFE7A537087A23D4C3DCA02C
+ DE4797C66BA3AF8FC8BD8C1C91047583B99DD5F9C6CBF6FDA591F8F2D558BFC3
+ 9EFA3EB42B99EEBADA30FA41C4CFE28E76137A3CC89E3E42362292D6639FD205
+ 36EE07BE6C21268A5EF01102F4DEBE916D70FA72586AC15762B36C4E2D326141
+ 29CDB773F7B5E675C7E6BF9B82D888A1C23BA275FA89A62A6ED355572227DE22
+ E5283F2CCF3D2E5C16A6F9E99D39146AC157B6C091519C2035FA7BC1093E4854
+ 928B51B394DBDF0AE4CD040D4982F6CBC8AA1AA7D9D3546F032DA5F1D50FBA0D
+ E4DB4C1FA6F29562CA9B1FC3FEC423565D9D9C7A7CCA6A76469426EC95EBACA4
+ EA15216B498DCC42B0FE42DD0DD305FF7FB6DDF28BF5F861A4C5D0D98424D005
+ 005A3BE48004035861768617610FE7E92DF08F0AF3EF98B0FE0FB9CF0BE00414
+ 66972F7E5F5E88518727D49EE9F5AFF6E467B739D29B892EE9F3BF8BF9561E54
+ C8A11259CF3CCA94074587B10E57B67D5B9377FB9B0FE98001D074794D5B19CE
+ 95CD7BED7AF53357205A1AA463F94C15F784C266EC8B046A5378DDDFA189CCF3
+ 1FFD7379078554AC01A6080636F3856283A898B0BD707396681492AB6546EEBC
+ 4751A4256929DFA1BC8D8A895359CF814CE5DB1C157EC1A20842B358D0D3EC7D
+ B2DE43A7D47822E981AD5192FF3A53E183B91F11A47C061B8C14628577383A35
+ D252E5176897A04F12FBE0EE1B0276F9D848398E0B8F610C0BDFBFC84A3B4495
+ 6B7F59449DA10B4D6168C7FE60EE5DE638955BEF47E235D42E4F4E71908A7005
+ 55309999A7639B8F8A1AEFEDBEB35D017316DCEA6ED307332773180656EF8EA9
+ EFC183DDCF1E95481B4672761BDF58E08B8352ED34519B38CCA0DDBBD494B551
+ 752FFF4CEA4D15AD4871B067A03491AC73DA4C07407989BB59341FB6AD8C5A7A
+ BEA3B2CA7451CB669FCF9CBC249323708C670F038CA4D08858EDD752DF3E34F2
+ 92E98938670453403DBA8C731D1364B0C114A28252F33EDA13FE51BFE229910C
+ 69FEB3535D057A460F79B2D51D2E8011296C07DD65D5D42ADA0384D01E9D7874
+ 202C39394D9DD62B33F32FC467A0F2B320104E3E5CBA31844E49E63FA77532B0
+ B631AC4B345BD126C630924CACBE724077EC43CE2586D7D0A675F1D1665B77D2
+ F5092B1D4C203172DC7DF0C9B28AD3C2109089AE026691710A4B41EAECBB0CFE
+ 1E458F3B067FA83ACF3AE4C6A360FB77F7524381CC7FF6B893E80A89E376EF49
+ 119C41EFBD35373D73EE275C17202E948AFB67EABA10D3507B5B76B03E57C78B
+ BA9500D83379D1E20A5C9AC698DBC2AABACB93FB093AAB27BFDF35ABF576940D
+ BEE36DD2F1F51B367EAC4089BD05909D8713DFD792CF81DBEDAEF75A5CBC3676
+ D237B40D1190B5E148849F01ABBA4E6CB3FEB48D030574AFBE7722FEB201DEEB
+ 8A6DC51B68A3D7EB9EA4694C8472DEF5B1859F68AA54ADB8F89BFA1B974BF969
+ 25C93D95698DA1168B7EA8B81CB61C3176ABF37E62107392D451252153575E3F
+ 98C6348C06F7208A49F64934FEBD8F1722D15D71B18FB62C98A7C16D4D870B27
+ 6A627E2D3CE60F4F1A6893993770085CE8C20019D4A397B3BE51905D4E672F61
+ 279F81661F4B16C01D9A6A2A71113C43A70FE4205203B626D075655B1D92615C
+ AB892B2C0626F477FC72B5901917867E1A3F79553388D9140A042E9ABBC48F9A
+ B8FD865FF575DD59A22165446736CE543016D3D606DC098D61E4DBC1F826E5FB
+ 0E265E351478EF08728273404D2B8E11A1F8882A44A81FE054A848CC6126017A
+ F3B0
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMTT12
+ %!PS-AdobeFont-1.1: CMTT12 1.0
+ %%CreationDate: 1991 Aug 20 16:45:46
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMTT12) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch true def
+ end readonly def
+ /FontName /CMTT12 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 33 /exclam put
+ dup 34 /quotedbl put
+ dup 35 /numbersign put
+ dup 37 /percent put
+ dup 38 /ampersand put
+ dup 39 /quoteright put
+ dup 40 /parenleft put
+ dup 41 /parenright put
+ dup 42 /asterisk put
+ dup 43 /plus put
+ dup 44 /comma put
+ dup 45 /hyphen put
+ dup 46 /period put
+ dup 47 /slash put
+ dup 48 /zero put
+ dup 49 /one put
+ dup 50 /two put
+ dup 51 /three put
+ dup 52 /four put
+ dup 53 /five put
+ dup 54 /six put
+ dup 56 /eight put
+ dup 58 /colon put
+ dup 59 /semicolon put
+ dup 60 /less put
+ dup 61 /equal put
+ dup 62 /greater put
+ dup 70 /F put
+ dup 83 /S put
+ dup 88 /X put
+ dup 91 /bracketleft put
+ dup 92 /backslash put
+ dup 93 /bracketright put
+ dup 95 /underscore put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 113 /q put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 118 /v put
+ dup 119 /w put
+ dup 120 /x put
+ dup 121 /y put
+ dup 123 /braceleft put
+ dup 124 /bar put
+ dup 125 /braceright put
+ readonly def
+ /FontBBox{-1 -234 524 695}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5F0364CD5660FE13FF01BC20148F9C480BCD0E
+ C81D5BFC66F04993DD73F0BE0AB13F53B1BA79FE5F618A4F672B16C06BE3251E
+ 3BCB599BFA0E6041FBD558475370D693A959259A2699BA6E97CF40435B8E8A4B
+ 426343E145DF14E59028D4E0941AB537E34024E6CDE0EA9AF8038A3260A0358D
+ D5B1DB53582F0DAB7ADE29CF8DBA0992D5A94672DFF91573F38D9BFD1A57E161
+ E52DA1B41433C82261E47F79997DF603935D2A187A95F7A25D148FB3C2B6AA32
+ 6B982C32C6B25867871ED7B38E150031A3DE568C8D3731A779EAAF09AC5CE6C5
+ A129C4147E56882B8068DF37C97C761694F1316AF93E33FF7E0B2F1F252735CE
+ 0D9F7BCE136B06EE967ABE0C8DF24DCBBF99874702ED252B677F407CB39678CC
+ 85DDFC2F45C552BA967E4158165ED16FECC4E32AC4D3B3EB8046DCDD37C92FDF
+ F1F3710BB8EF5CA358ABACA33C7E5ACAD6BF5DC58BDFC3CF09BA2A38291D45A4
+ C15FF1916FE2EC47FDC80911EB9C61F5D355BEDFC9DB17588547763AC5F0B1CC
+ 12D2FFB32E0803D37E3281DA9CE36C5433655526ACFB3A301C56FAB09DF07B5D
+ 048B47687348DEB96F3F9C53CE56DDD312B93D3918CD92AF53FB9461864D11B8
+ 0138918D0B1270C54873C4012CDE6F886DB11BCEA04B023EBB43E0D0A06BE725
+ 741D08B9DB688731A6C9886C15A83C28DADCC81385EA239E045E8F3670CE03DB
+ 9EE77ED067036595C9F3B1854343BE3A12E486B6E5A2F8AC44FA5378D28DCCEE
+ 306B0E283AA444423F9A4FF38E2B56DCF67A39CEB2C643DAE86865517D5D0371
+ CB8797208ADEC637330A3A57902C9A88EDB75A7C16FA9850075D9F19578EC666
+ 1353CC1FC512D59DFF847ACCD483BCCE2DAD5F5A411208FB90EFF327E22C30B5
+ 58F9D34483864B061F425FC7837F26253B0A74AF24851B7A997FCB58C7FE029E
+ 2D6EE0CFF083B9D45DBC297188FEFD438BFF56CE6F01365BA970623AA85341CA
+ 43322A57E6CE91B3BBCFD2F24D9A0DEF275E19C8AA735CBD4A5CB2DDFC091B2B
+ D6C16961F6B6B993AE9B578CC97DE56A323AEC779AEA26B78D7F25920A3773BE
+ 20D249BB8F853EFE95030A2B4275B1AD9A8C562D53CF73AABB149B8892157C64
+ EB1CB07A4DF6D50B39A5A6793AB367B7EE2613B14F59DF18F6977D7E79A45DB1
+ D8F282781CB96F87C034DA6D52F69D352A1C5ECC547DEE096BAD6F2B3FBA11F3
+ 0B770BF39C38CC2E5C0E61EB0FE0AAE17246580F5F026E5AB84C9EB4E92036DF
+ BB4102C968D748A846169C4130F00C294236C6ABA13D115BBD0349D5E6900BD1
+ C74B078ADB1FD9B4F2E8ABA04BD2FDEAB68AE36687B974B5D915EB25937FCCFC
+ 43C29EE6A7FADCEBC96C380A2ECF828D2BE47BD6660A7CCFED5BCE7983A2834D
+ 3D831520519904A6225FFDFCCD3E83AEB70D34AF33696C020BE63435317C1E4F
+ 4FE8458DE8231F0BD97F16DEF04B1473626C1FC7D23EEC85ACAA4DEE0D45113D
+ 634E6E83700B45F5A54482D90B857FAEE51BBF207ACA9268A97C430568DD37E2
+ 7AA98F9EDC71CB8F1E6AAA51D24F532E0867071564E935FE57934130CD6BDD59
+ D93B22FD7A78B5F313B52C98BE6C02BE4A8C1B5F410F0C77E69023B0BBF509CA
+ AC41D417ED564AF9E0598CB52E0DA5E0307884C12FC01DAC3C37A8888AFB85C3
+ 82743DD123DDA7AE74199ED4CBF9DBB62CAFADE135DAD58383758A2FD103DDDE
+ A14FC73AF7CFF537CD8C2B47711CD0D1721802046E1BD57CD59C0DB10EFC08AD
+ 5334EA27A75702C8FDEA5A495D716B1198F3F53836E3A8D5185F42C392826272
+ 1E04E91ED50AA3F81E7D15E47C854DD91927CB1186E1AD74B7BC7839590CB68F
+ 9DDBC299ADCCBDE2AE156FDF26D57AC44DC229FF1ADDB386C4A6D8EF531CAB72
+ CA8402BD9839980A4D42A9E478B9AE57ACF542697F2E5203B9D04110CC3D1B17
+ 1E5F0841BF57D4233B62EC7AFDC82C3E7A29BE87786B9B2D5EF2DF83BE27D437
+ 13D8F29E2924A68582BBF9138EC23EE532E538661B8438B91ECEDC54D6619467
+ D2360571AF66A4B9D9BBBDFBE3526713C1E40D1B9A372483D7998C856ED18DE6
+ 10826EB5B841D48E04099D4148B97CD648ED0682D30B379A05B176C747798DD6
+ 28124460D17EB94CA7C34782DD1DEFEE7E7BA42492D3C668F13F23F08D9C090B
+ 68D3E03CF3A93DA5369379F28939B20D79E6B0D769FD7FEEE152DB695A1F28D9
+ 03AABAE3659AC73171847E2F83007D81C497CEEF2C9BF24D48CB0854FED6FBD8
+ 0DF4B3689776B16A85E33C2D0E27702B9D72A2744D0F5170B51EAACB0FE627F2
+ 1EF5D945AC6FA8722419D1C759D6DA435E356D879254ACF4201B9EB39670B44B
+ 752CA9FB041CF906E030A8B5E69E17706937003FBA14CA3D8DAF52465E3AACF1
+ D4F36AE7B276E9DAA4AA94F5EF3A779C9B2741379AAD0F43800C3DA5D0BB503F
+ 34F8CCD7FE5E8D80E02022B9419AC915BF69FEEDA3BE0DCA6A9E6F99851E643B
+ 9B4DCCDAEAB90A7EBCA89FD40356F07E710B58C534282DB337F2985546BCD286
+ AE21BFAF894566482D99F544BDD3DCF0F344F3BD1C8F7FAD6300AC7702DB32BF
+ 1B9903C7532C8BD79F6812BA6D50F1BA9A4CCF21006EF848E417D250DAD72FA7
+ 618622D7CFB0F2C3C607FDF538FB29057965E6C246786FDA42B8B0B4A3739A26
+ 112313A034EDA5355F210ADE6CBCB282DCBCEAF2EA902442896B2A8EB440BD44
+ 0AE05FD820ECB3B418CDA353909A8D16D65FF3BF3C0C683D9B4D741837B7262B
+ 078303D329DBE4BD6282D3BFE573C619E2907062FB7F0A1A96C11D502A3FB68C
+ 3D7A8947CF03C708640FEE7E6DE028C3B0349348910DC6C4339F01494B99F5D9
+ 5AB5B2A6D8DE926D32129D3BEF991AC10907CA228C8A5DDB4F4C9E02E388A665
+ 708336326D905ACE5FCEDD5219EA0C552EFCCE3F1675E679DD8E507EEA278D37
+ 4AE6DD004F7A5F9E6AC53AD04170B14435F1FD5DE6B9D44FC53E73D78A7D727F
+ B9DFA5D36C3A59980DAE290DA3462FA191565102B32FBA9CC15370A3CAA159CA
+ 4B6673376290880B44935B523E648E0E13EF9652E736DE8E296D598E6D2BA590
+ B7489444A31621C4FD30F063F0239C4B412B06D87CC1B6AC783CCF1C6EE177C5
+ 034AF9307576247A9DE3F2E34DE9D494AA4A7676D0E6D45A1C8962DABB04288B
+ 6F9DB917FA305848FE81D04EA17A3CC9FEAF499EAAB38FC6933D7D9DFB2B668E
+ A7721BD0D85E6C23761A2A133C571919293A7EABA1CC0B00D71467DFBA741FFE
+ C7556B58391F8A1388D50314E634A13388BD75062104D5551C20545E41B0DAC2
+ 855F7A7BFF4F31D09F560EF0CC1B4BFE0F50EFA82BBB87D00D06413DC60E7E01
+ 7B91F09187E8A8A2930E25D9CD866C04BCA80A2E02E5F785FB5B979B751F4CB3
+ E5EBD182ED6767336233E32971F3F91EA893ED0D2B7A9CC34C2A7FA17933DE28
+ EA1AB135BF215012C189CC53F2844161E5D5B5E8839237A645604800F645F5BD
+ D621D0A90286D73AE85E486FA67FA6C62AD412BC2381B709335EFD2DC1D3CC1A
+ 66102591683FE8E512C55C42CAD7CDAD35B61391FE787796A7A068E5ED5298D5
+ 81A5ED5B28AD0C85FD0FA75B5FB0D6849E8E1B60043F3FE6DB8B6CB152397E58
+ 605CD8D7D2CF5B9BEFCC2EBD1EAC808355994E61BC3D3D4A4D2537CC449730B4
+ FF5EC3D8566A77BFFE6B1C638D77ADE861EA726C3F0A01899CD8160AE7C9B712
+ 3EC9BB9FF97B131523A8A9FF99011292E2AD1FEE407D5D5BAF518BC6EDEAFCDE
+ 2D01F8486BCAD41D38321640F46593D1D60A2AE0543A7BF8A6C60EF1E800D9B5
+ F85DECC999360B2BA2EB51FB0E9E20114180BB6C6378F2F941EF5E7F3AEC7C93
+ F30E2B907019FD1FA81FF60C65A79CE036274E510233FA2CE3BF5F6DA936B779
+ 8B3FD05135266983B07D9BA27A15CE4B30750604FD1FAB9FCC4FB10FFF2F2093
+ CA7734D13C8D16D3551987EB3FD64C306B24FA5F661ED2896425132EFCA62CD9
+ A6A6A84B8EC86B8349A3EE8B8EAC3455337E6D50CB2B8FBE5749D474747DAEB4
+ AC335923F1B02FB750454FE7AFD0868CEE23934146E38882F4DD59D8221614B4
+ B7A90D24E362D086162F31E12D941622394398AFFF122E37D2421CF65932A5FA
+ 1BD94AA669BB7FD60FDC2E5D58755BE3FE4A95090BA4C3A41503CEFB24C725B7
+ C65A86C51C99C43A4974EA5011901B09CF228A8DE63F47D314D906D14F6220FE
+ 4299D72926AE26C7CDE22021405129C767EEE3FCC1B0D112C4B7D9BF377D058C
+ 75173E8A83390707383D89ECD49B2494742E63C2B2F969237103018A42B5CEEE
+ EAC96EF6B918498AF057D95C73D5CEB7653097FE87352C5BF8CC39DF9CEF53F0
+ DC64C1408BE9692F702333794F428AE6A711DB8F3A6366EE387A53BF2EF48510
+ C02FE69B979A7D6ED148F88B9972CDA8C3D3BDD86B0AC125107B6F67EAB63726
+ CC59B6F75508B8F6EA073FDF5B71B5D4A0B2F7F3E4E89E74254170E7FA3AD21A
+ 0EAEA2879B1A28AAD5373186C47597FD01F43DFD339241961EA8D5C82EA196F8
+ 086F3B446D27C96490F390F430CF5907660C7EDD7B5AF4A3456CB9F9B0ADD010
+ E3BF53FFD97425CF881C1415FB02ED8EC3774AA40C8687CDD976AB3F3B412C76
+ 88DF07D18CA19B56DFFFC9C41E1C51BC93BBA012819268F066865C8E52453478
+ CDE92C62768B53A006F2AA82DE089D67F052CC2BA15231AD50A51171C7870974
+ 8A4E4910EC70E3F1F244DCEBA0449587FE9F945FA055C6D5FB2AE5E5244C7BDC
+ 0843B7B3AD2C55E98C9B0721FB7597CAAE335232D119EDDDD42DC64A8AE473AA
+ 325781498A59C6E445856C7EDBEEA2BB62AC019A5746F9C3D34CFE4D350E5EC3
+ 1C43664D9BBED9D76A6A57DAE4AD963D5554C0B924A0416EA1AB368DA5FDFDAD
+ 64DC00846BF45E55E77955B166A7D2D173AB2837538E3F37F1E689D1CF831B39
+ 1486044B673652F8712257C312D244CFFB5AA1115BD3B4E4AE092B9F8F7042EE
+ 112E13B614A3A28C2C6A7F51326BCC06059E3D8A8896A3CD0713B53E039B356F
+ FB38212C86FEB1B145D80CA9DB1B6CD516DA2164FC7D8332BD63117074689AF2
+ B912A5748FB7E4D73B21BAC1BE0DB4E1BEA67223869F9AE2DC259C853CA5426E
+ BAC081E4DB6E8ABCB84E8973CA114F521EB3C1D5780C6447768C8D5B792B9E3E
+ 7DBB93DC140DDB6F83EF347ADC89EA0EB5A0D57E175A71C5556E597E89805056
+ D30DF726D38ACDB2BC6E06AF31E6F0A2A5C05A8933E5BA8FF7FC2C0FBF68986B
+ A5754C2E77EC87A59F080DA547BD0DD8AB5C5CE6330F731DDF5AC87F9E333153
+ 652D4E7D2209006FC68ED820CCF516BEB9330B836F46886566A6FAFE13D303DE
+ 4A259B6CEE9748827F2ECC9F919E003BF196050DBB6CE2B94CB4D90A7C72EDC3
+ DA4E0632DCF2556325E6E3DF806407898952D197D6B5A347877A644F72A9BDCF
+ CB21414D294DA922D6954E1154D9D35930D59384F20935A1BF68BE9AB9F81EBC
+ 4BB8202BE5A9B1033906D04C5CD719F266E19D890B126370A96B991399C1C83A
+ 56019D9263405E1AD580CD69C2D690C7623BAEFF52B58F12C792AC8D984F2164
+ 810E7578B8EE8F106D62B67849002E572E57CE4A833BC8071C1882B9B16E8AD8
+ 4A2E01425C2BEDF771EC873802021FECD0A2B060B9351EE0A90ADE1F604AABFF
+ 5081950588F9F4CE2F5B3A0BA0271089780746C322CFC3A200A0A592EB69693B
+ 294DFAFF804AF657D31566FAAD42B3664830B33A8EB6875A39AA3C7E2BA1B584
+ AA57CFBC689F3E2F6FDC8CE0639F6D62E154D71FFF42F31A6DB757EC1AA8CF5E
+ E9595F3AEBF2E70568F1B7302EBD7184EF1E2E22A892925E83EDA721A2A69A3A
+ DC94D83558F2B608EB708825116B8994B001F9A2F64B30EFEA518D90A99E1D5F
+ 2416206F3699544F49D54A2A7E5FC952199DFBBDC3ED3847609C7CBEEE6EF7B9
+ DC905D343EBB37433B6DDB2206382F58FD1C191258000337B47ECB49669584D9
+ 485FC8DD09630244D9EEA94F144EB04820AFA27204003F09602CAED53979FAC3
+ C8BFC4436A4E25171D8C98D0DF628CA790E60C40EEB9F4BC7AA99D3536A90D1B
+ B9BC619F915068ABB0D16F746BFD81333854CFDD27D45B5C3C46E5EF9B3BB429
+ A82EACEAFE064E1B9619BC9FD3FE4C5835A6CA1E9CABD53AB70840309708FEE1
+ 7E67F90F723F89349E5CB2E8C5D1A554628FC093067031221B00F5B929CAFF1C
+ CF7B0D9462139575F4FC9BBD8730F9ED46BA3E7ED90BEF448A4CA3CACF826114
+ C477633354EC4E4468769E1529AC6326F0C038E761841CACE5C605119B09396E
+ DE09C0D4C6BED20EFC037E504C91F34B2894F0683ACFA419636435F52BAA0D82
+ A899348E2C48A9FD9A4BE604FCF50996240A620EF13C63784892B3037FF75EDA
+ C8CC1505D0E212EE41D869824F10DACD8A4F51B3F381D599829229F5CFD89A9F
+ C384313F404EF577B2CAC2976C1DAB640250928EFA5069481F04DFEF946CE74B
+ 71291633849F73A517C74BC99A2A917C0E6C984B8266E2721346EFF5C0CCE804
+ B4E9104725CBF6D8E3301694233FDA06BBC7D8952CC333EB845F70452CAA9D63
+ F5907A05DB61AFFD9FEE9F3762896311A86047A03FA3A488F966B841B4E8B715
+ A899DE001B5C31B5180903EA5623B85FA4392D2EC56E16902066CB771D66153B
+ 47C8215AE56E2615C0C432AC6B6C2F761EE8572D7FC53E5C0145EADDDF3F78D2
+ A5616992C67CFF190B0BDE1F697487C3934951B22F8DF2B45045BB1331C917AC
+ 4B1A76816B86EAF180A10A046F8A97AA966388B8766914F2C2392613DDE8E262
+ 7DE8BA612038390FB64E65F3DB2657E3F68FFF1C37BB28F581EB7A574D9538EA
+ 2342C3FF3433F03A0507859C58EB089970B5539180D291E9F978DB158EE4ADA4
+ 1B3EF68C8B881321D4112AA048FA2B162D7911D7B28DD6C50FEF80D5AB740DF7
+ EE757A73AC98615E517085DE0F69E4A40BFEA1A7B5A8C28D72FDEDCEACD21591
+ 0B8419ED6F7BCB9FD6EB5C00CB351E4B437708988A3288A370750D90A86B3113
+ A8A09E4F74CEDF48F956C094CE5E860F1DFCB05B9C8B74B9BC4DA4E4189C5C00
+ F24F20FCA0EBBBB37B0912F72E581A66685C9EBB7DD2C5E2C09E42B4D8F30E72
+ FCAF31C64F0D189506F8EF093DDF6AEF64DBE187ED72296913E7D3AA9DF90429
+ A35D5DD2BA16B012302382E8B660C300CFFB9D8576C56677DC8F9075861C7FD6
+ 654D6D77F37ABC1E2536AA7AE6E8898DD5FE9171913C9D0F1752CE059CD588DE
+ 69AC912C213D470D047D8929FFE8F25B2ABD7FAD061C322E6B8D1A6E5EA86CC8
+ D72122E7D7377AB248E31054D5E5BA5F74452628522EA7587E447915A2370910
+ A5AFB919734AB0244C47822ADDBDF68CDB4C8DF044110AE7C3911D23E7A2F601
+ 85CBA1C6DED6D8FC0269F7ACAA4F52F1E6DF469FAC6AD69F51A52D8E1CB058D0
+ 539C1CE0E5D9A3547A962680022A2A748612ECD7A269D29847C04DFA2AC0045E
+ 342A0442621C1E7E7CA0D8D0816FA87AEB353088958FFCB3975EAAFD0BAB592B
+ 15D6730A03C2F3D20F0FC535D47904621EF708D619051C27B968DB287E601A0B
+ 0AE1AB4E8C8121727AE9A82610C4F5C361DACE4E4244B03524D08C9C09D6BE4D
+ 0EDA5C606027BEA677BAA3C50F26509330BAA946610447351C6A3F24FC854006
+ 77455645D5B70333CB44D79D326D47AB24F2DEEBDF4DCDF8BB46054C045E8D72
+ B65911BEC3390544611E7B769FC32276484EBE6705753E0CDF7593AC96064B80
+ 40C09B0549DF57DA5C5BB29E4DD3ADA5A6D6C1B86CC5F522A9E19581504E515D
+ B13B84FC82F469585D69B0D0D95C28DC50B992C441C5D014FED62DB7E4004153
+ 8BCD90C83980410409C290DB88DFC3B79C0899748AC33E7349E2B0E8C0FA84B6
+ 79B3F53E5EF82C3D0B74400E4FD5C07DDF4CC70145FAA532BA2339B4803BF586
+ 86590FD91146989B9B2D4C5C1D5EA44EE04699FA55DFFC6A915A4B4045787A3F
+ 4D8A7536DC6DF5C55BA461FD7C3FFD071E61FC8B051ADC83725109F29468EFE6
+ E5F17EDF557D923938A81E6D4265B3FAD7738A378F34DF361F2319D6D15488C3
+ 86B30376DAC6206B86276AD88DAAF8B5C1D4332866FF2C3A6C69A871427A4B3D
+ 2E0154C1340C1B7ED0D16D2E36D3495BA4C0542D9130971BAA988E9A54939131
+ 009D6FA0BAC308804DC61507219D19857ABEE64407E0F2842DC94DA6897F5465
+ 655A208F8F9F851B441AA107163A9F281BAE1D17566512B7F68F407E329DB887
+ 1A67CE0FA1B5180708C4D093619EB5C28CEE09EA025B018D97FABD4E433E524E
+ AD6684FF86637D756FC188541E74E7FCD3ACAB68A63010999B16477880FC8292
+ 29FA9E5917708FF4CEFD36FB874F2DD9C11A9EE392F8B811785C5A5D80903E48
+ C591B5A9B4646B0B7D1FAA8FD38E3AE0D0F9A3477BAAFC02C8C46EEA1282811E
+ 4D4BA037B0CE28D2CEC3E726603AE9FE0F4639271EEEA9151E29BA6D4A9EA0C0
+ AAB44FD653C78B32B371AFBF35928C4E24D4843791573705DDE2E72E369B5A9F
+ C13D3782AF038471340521500514DD1CE917654FA216587879F8D6B39A9A842B
+ E2391CE9F60E384BBA6F6C2B81972BCB087250CF77C0BEFED70AB21B507C7851
+ F9D293586F8682E1535CC4221637B81CAA4C411FF33EFF17F0EC1965047B9384
+ A992791ABA3C39184159DA1E01813F96DCD6142C8CC2ED4A38812D6C99D89A6E
+ FE8F29F3575ECBD0A6A9BFCF9A73EECA210F6F67BF6E268DBB5F7C7DB1ADC731
+ 3460BB937106114D16E07AE4DD6DD70ED65D04FB2C32DA3E14B4FE309A59DBA5
+ 712DF7174603E88DDC35F72CE9AA8D64A0C2DED67424A810F599E6E3C6D7A3B6
+ 7A6BDB0617103214A6735783C3A12DD2A295B5F23F9990CC28A16BCB7D661BEF
+ 360FA1F53FEB2A0F6381865455E320B2942A1B5701F420AD1FC95CC8521922A4
+ 5679C3F78A120F4DBE90CC18E062A7C34CA272D85C23EFEEE3817FB4D995D4A1
+ 3788640F4C5FA971AF5E99AF3AC7B7A6B83E525F27D4FC5DD494C1367FF27AF3
+ 1365894D78F9424BA04847EC64CF7BB6604B6EE8392DE79E475E53DE1DB1BAB1
+ 0F959679E6EE3B28917DBA62CE563511D4D57B0EEAF3BFE31BB79AF726963F45
+ 4F438501D6F7EA2840C7C34B2FD72339622F9AFBEB1991007E72A281D64D108D
+ 49ACB642C6AF85F078F9EDCE4F2734F09FDDE1DC72DBB11C7A16EDF7D965EC69
+ C920611ECD1353AE6C972D5ECF2F4B22FD6D7F889C2F65C2218880D9D4D02C26
+ 2F28E22F4B1321D6F43E43539B597194766D1ACAA2817367EAD3B93164D65E0B
+ B0424DB395AEBE58CED32D075E5C0698A69C1F1524FFC4C7AA96828953665E50
+ 9436AF7369216AADB5C1EBD17AF7C3B866C0155E2ED93925CE2E5676EAF72259
+ 10645DFFA5AE6C8CE62EE5C68AFABF5AA8DAF2B5D81193718DD58C215E171831
+ B3BDADACDE9A6E3910DB58E52F2063E80317906EDB49D2BB52B790511AF89381
+ E729165B2A79452D832C166FB88F638557F36DA1D408DB3806E93843F452C2B2
+ 64281A352C1F73B1C8B0240117010DEB0B68281FB292BBA3DB688D97F5D839AC
+ DA21EEA9BA22747E96CDE6976C1E780E0DB1601752C35A09020BF3D6F94A4C70
+ 9CBEDCE49B4C165682F8A261902FF98BBE5D7DA4C8A0A24481551B9B12165113
+ 048B5E3915403FF736D37AD5E2590136F1C47C2E0A88A355016EA3590A0B193D
+ 2DE01CA58B21B1099E293080BB2F29204B1D13394A6C698A2E2CCB555D2EE25A
+ 0142BDE2B2F0CE8B38181506FE1921DFD5D6161B46E86C694A7C2F54C8C6BB68
+ F230DB3E81F4BAA2CFF88EC1D69999588BD2D8515CD56C7866885C0AFBFFAF65
+ 84E898B2D715B83C7F0DB41F2C978AE030A875FBF76E1C5F07B0B0838582C232
+ 3F4A7E4E5CFCCE28CC35F56375E557E78B3B7EF0F2249EE516AFB5CDDD33F8DC
+ 2CA8BD3FDCD7303CAF63D92E863BF643B68CB1740CD143560C223D442AA7CD64
+ 783312A7C5187BC4666DB0F7F7A530CA46D1487AEEFF3B8A2A9E4A2532A10D3C
+ 3FB1F334B402E524C0F9A34D4DAC5A6C4CA96116E7D1329E478AF42182817243
+ 7FC05BDA8D6DA678DFFF60D60236A28F73FAE9FC43E0EFF071B3B1218C045D58
+ 95C4E9ECB114FAB861E8D1CBD0ADC40A087BF51F6A21770B1F4D4D05E17A6913
+ 17FF5292F404D742FD862A454DBB312C8A1BEA54CCAC0A8E766D4B41071EEF5E
+ 6A1F174B8154BADF3131DDB7AF48EDA733DC6E876F2F9235D8051B0CA0487D71
+ 6F4CB0E632DE097CB155DA7545E344E025408570AC2E2882F93270BDF6940B2D
+ 7B5EAE0CAD84531C89B2DA6229B7ECABD58DAC204F80A8976FD754740495A9EE
+ 6DE3B63C307C52C12A38AD532818F588D1B6208658EF821BD28C7AA2B585D8E9
+ 1864C796EC37CD1A229BF9AEE748033A1F8E0CF9B835BCF1C0BF56B4148EDCD3
+ 9D46424A7AA5DE89BAA1B264DFE405AC584F22588BF3908B182181A7048B6F5E
+ 43A50D838834E29F76CCD01782E724F4A994C92F5D2E7F4E50C524F0DA6E0643
+ E12D3F6654BD7C5A5ABA03DF7AF85F2D92E0F96B91F83E0778799974389D9028
+ BF45CA3C2AFD14151BC1435B3FBD687CB1E3D743D5572AB6F2CCFC50E074239A
+ 1ECB4845438BA768FA9611EF44F66CA272BDEA1FB2B1E99D28ED350FFD6655BD
+ 1B462D1B9B20119BA5EE55510506E41002ABE340572CB9B0B71B0D711DF915B8
+ E90E432B0051C2D60FAA4BCE6F2890E026AE990F7EC2083C547EB97B8607087A
+ CD6480308FF70FDA73D3F57376BA671CF6937AD2EFF0FFDA7EF07E4D8E659E76
+ DD3FF4B9BD00038EDCC9FD78EA5050ECC23FC2EA2A16BE1A95033B3E8FF454B8
+ C2961509E98D9D282294F570BEFFCFD3DC49A7C70C0ED8255D4B427FB0B19E7E
+ C85FF722DEE40D2C2F1081BD42E1B8BC22EBA355E83536343980D5164E44FDA7
+ 13C72CB396EA0D55B7CF34BCF36AC84467F4966A74E05E610D14E6A9A4B7C0C7
+ B0866D5240375E6121BDEFBEE38CF520E384010B08E5FB2B5BA7275D332C5B66
+ 663AE2D0987A5207276C0C4D9CF8F4DCE38F3E4933099028CA1D5219D9D68CD3
+ B5968148668428BB521680F976CD6A6E8E85B168E349DFABBA7FBEF678AAC9E1
+ 353DFD961C8503E5C42651A4012A5F544A30BE9DAF930CBBB6CE5D167AB4E31D
+ C83AEF616B75F15BD04D1F2E20E4BA4AA62D6A98132C31E27B341FF08D41045B
+ D630197C04A7C0D34029FDF038FF0E7CBF36726121FCB20F3C39581C397ADF21
+ AFC37BE81FB59697189EC4A28F2CE0BDDCBF88F421B6C1E80DB881C54134CB64
+ C4EF9510EE7A1D9BEF442F08C87C620E8E8949DD5A7E917A6D56D891A8212743
+ 261F4A486D61D10D29F8518A8100234C9316CAE60FF6281AD6B0B75539E8F99F
+ 3790FFF23C0CCE3857299CDC3354C76C3C8CF478B73E22AC27486939CFD3DF51
+ AADF301ADE783EC3EC63172ECDF2CB17ABC8CB700E1A593AF701E612832A267F
+ 39707EC631176B5D99A5AFE6F095224BBF6FC9A22C482B7F002D881EC0A81ABF
+ 569CE4CCBC05E591F315751882C10B5A00B91393D4AC5AFD73637FCD1D1012C3
+ 798456CDCF6DE6A4E079BA9ECC4AABC024E021C3C8403E6783811B40C6A7FCD7
+ F640EB3D8DA3DDCE3CEBCB2F64D42ACE2258CC40693F90AA4C821C3BE5F2FC5D
+ 2894B5E82B6713F66AD24FF05D5A4CB9BC32A9A307C15007CF43511A67192F2E
+ FD4A84B70D5526D1A891898BF716448A0E478BAD82F7A8B983C6691D5E2393C6
+ 7FC11A8D80129216762900F8A58258413DE7EA585F2D5E5C5807D257BFAA4FAD
+ D2D5B42F175C530349D91FF1CEB72098DE710829C30FDFD59446D10D91E898D0
+ 56A8FADBAF4092BA50B67FC690B83BAA1146EFD43FA794784B5C0F07BE247248
+ 6AE4CA0977D7A0F3E738F6C0DDCC7123B955333F17D98251638CB2FB683033F0
+ 21DDC98A6B78C4A2A0837A0DA422DCBCE343E9E44FF2456CBAFC4D781BF91770
+ DACE89070FDC030483ED92F6843B10486EF3F605340A5568D25DFE5BFA9C504D
+ B23B52B2FB6EDAFE967DA33A7C75D5E767F70A92C55480B3434E03C491B29CAD
+ A5093927F0DEAEAE0BA8EEAEB620EF6082D7787D93092A90492EC5AF5BC72688
+ 59E6DAD7EE49B4A20CA455D9C7C3D90E98FBE123EB210FAA07807C75DBAAE527
+ 2ACCC4C6455D606B6AF1D35A0354BBDB56C7FFC4481B971430374874F4271CC4
+ FCD6B3EFC66262FFAD50C410516342484C52DAFAC32BF568B1782C66D494F043
+ E0C11AD55110056F1AEE0EAD6B9A4E7616D49065DF7EB3109DB6BF2A2F79F63F
+ A61F1F7A962A4C11BA4978263FD8F990C5D67176C1431166A493625C5520805A
+ 39184BF8E6D183F5EBD0A0D61A154DA0466D1B6BAF10289685587385ED2377CF
+ 5AB7D4ED9745CA0528574ECA332411EE55848478A91F40ACC98EC4A5D12F8022
+ 8373D005F0E5CE0AA8B76DFDEDC298E5EAA911A0A5929689F7BF4DC1CF50D2B4
+ 2B74DEA0851C97D88A4265FB85E221C584160FE05EB30D4234E46186DFE48C47
+ BCC620AF2CB18BAC3C4ECF22D92C0D57646027DA78A5652D463245332745E1F1
+ 062F920240AD3E621B770D5DB03A77D631C2F61C95EDDF21C7A5A8374C64D14D
+ 22B583B8704CABA22602B02318A08F805D10C88A8C3A3927DB03AF35F0D1325C
+ 1BA4A2B4F8FCAC8EDA18DCC223DF2115C82BA438E03753A5D8C7F1F222708801
+ C22F4AE6863272B9CFE76559F55A095A941E1ED4B2840E7A8B945654CB9B8CD5
+ 70D49818ACF42AEED34599478D01117D37112D982138DBD6DAA82D0F30F216C3
+ F9985DA4FE530363173FC6EEA6C20DA70A8C96A8FB8199DFBBA3A159515EF7C1
+ ECB2C3F393D8C2E421C6266B2D6294E1BB173C9D2B9341C3704F16DDB7EF9D0D
+ 9306842B83EA532485CF472997E35EA67A05F98B6161890C345D87B107B599A2
+ 23B1E97D78FB774E9941A6E90535530E167E68B71E42175E851A3D5D27178E97
+ 3896033C5EC5B813E0F6D2B3E9EC7C9B66E59754C52E035A0A26FB26F64CE14E
+ 5601397837B4B22452F1F80D6A09B7750B358AC522B27BEE8A942C6AC7DA934B
+ 2D4B32584276217C2D465DE38D8E068CA63CE969DEBD09D15B6DF26E99A8C34C
+ 39126C95E9CCFFBD49D3EBE148A26B6FC134238DA7C5137F182213977C64C551
+ 3D8560778BBB9C4BDE75BD147B1BC251F46FA9B43C95E7B683DA3FF980168310
+ 42B4EB3F85E14D385DAA133419CE93A4E8E3EC52AC2B34C7CD3925E3366871ED
+ 1FD186EE486EAFF17C998539472C94377E2C3F2E58CD3CFAEFD09837276162D2
+ 526B1602B8118442D38C6E0E85BCCC3E95D989B9DC9B81AB84E82353F4D1D9CD
+ 9165C2413E89ECD0EAE163D5C390E02EBCEA24D632EA242C801328A1F6F83F59
+ 0AA01CE607E74D92B8CB13D20981D4556CF327F8B9C4E11F44B3B1940F9BDA44
+ 0D84AC0B2E8D722E14A1FFCA570545A2D1
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMBX12
+ %!PS-AdobeFont-1.1: CMBX12 1.0
+ %%CreationDate: 1991 Aug 20 16:34:54
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMBX12) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Bold) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMBX12 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 46 /period put
+ dup 49 /one put
+ dup 50 /two put
+ dup 51 /three put
+ dup 52 /four put
+ dup 53 /five put
+ dup 54 /six put
+ dup 55 /seven put
+ dup 56 /eight put
+ dup 65 /A put
+ dup 66 /B put
+ dup 67 /C put
+ dup 68 /D put
+ dup 70 /F put
+ dup 71 /G put
+ dup 73 /I put
+ dup 76 /L put
+ dup 77 /M put
+ dup 78 /N put
+ dup 80 /P put
+ dup 82 /R put
+ dup 83 /S put
+ dup 84 /T put
+ dup 86 /V put
+ dup 87 /W put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 118 /v put
+ dup 119 /w put
+ dup 121 /y put
+ readonly def
+ /FontBBox{-53 -251 1139 750}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712
+ B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99
+ AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26
+ 7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF
+ 20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390
+ B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D
+ 68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809
+ D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E
+ 26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D
+ F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26
+ 77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299
+ BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E
+ C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8
+ 30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5
+ 148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C
+ E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D
+ E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23
+ 337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598
+ 0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6
+ 472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E
+ A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26
+ 3266FEEFE1F2ED62F1442F13D5FAEAC4AEA2B95999F34125FBAED210923F255A
+ 571F8CEA1839FB26754DFAD6CB948BE9C2442424B97D25B9050F9026F3516307
+ 0A6117C7D37009920D23A5C8EB97DFE358C500556481975D7F266D95C8269AE9
+ 4F8E294B2D697BEDB878D23F7E9A1D1A9463B5AA629573028F3CBCE3B14BF273
+ 7F0DD6DD888230765F196377FF434D9F0FC6EC6B949F24FA011D7059C27435FA
+ C744DB25CE85527BB176D01BDF99BB6E150187E6580B61EC042A9197EE8742BB
+ 87F744AB7FD2E3D5A3D7242E8D0CD986CFEB188D318527EFF6AC0CFC6F13F064
+ BE06374B4A3E05C7370A01D256855A4499AD00E56153E8067CF513DE26DE95F8
+ 24B706D34A8BAB2AF41044C38C077C74AF089024BC6AD530CC01C6E25DE88481
+ 5173B063D38ED3A5B6E97B5064DC6100C540F37998F14D560AF20F29FB5A767D
+ 874CD4BA6623FE04F0E49EFE6E1B5BC951F4D65AF90B53052D1809FCD6CAAB51
+ 4DD6B904F2450FB711A04C42F24622B8682FD49606D7ACC7DF86C7318082E73F
+ 1895E7B567B45DDAB1F6C139A0A1C97A07BF7388C6A7FC9D5520D755EC135511
+ 2390C25E6EFC10812D2D7EDD8335A1AE9F72054C8CCB704E81B205CE4E1BDAF9
+ AE30BE659C7F56D9FBCAE216D40F9CE1346B1A35EEA223C566DF4B04FA7EBA58
+ 3B0D0C5C904CED2370E1B619D9B1AF954767A78796E6F10765E00293F57D9506
+ AE72BCE6F9EB27CF7574EDC1752B8DEFC3AFDCE81A9BDFD109F28864E208BEA9
+ 19089FB1D72D7D777E8A7E025407FC2A98B25E0C0B0B2FC212A15EB62970A792
+ 58D38F76A557FAB25BBB650339DDFE1DBCA2F3D59B2B2986C04703F0DE451BA8
+ BFD77B197C40FC2BE9605BF42EE290F93B240A12E3A7484F8609934994249A1D
+ 4837942D1278070BD7881EE89512250E4B3400041DADD8E3AE6521EC7050B00D
+ 7E482208A5578C51098C4CA9D261CD2892D7728A67FF329A6C76F2273D8C0EC2
+ 77E2FC789465931DCF146F2568F485E58AB6C6338B80F980C1A8D69D74F7D1DC
+ 0A7BAC7CDFF7353F3C53109A7AC049DF8ECEBBB07A12D3B8FC7FBD03BCBB133C
+ DC56B59BAB8ACD895D68B6387C57BD3926360B0F866BEBC4AAE955CC42564626
+ 40668C488CB20BAE29C9EC17AA163F2CA628D7363A31B49EC19C4B55DB406EEA
+ CE726171FAD1B589D7456AFAFE04345AA3F1F82A42C9887B727495E3F1AFCC13
+ 0918EBB762928245CFE3266DD36AC92BEF15D586CC203DAE2E17F589415D57DD
+ F12C2C2E343082E0D6F69DBC03056A338BA96C8B3849DB2B985AE410A385F8F2
+ 026A06392B1255A5F79C9F25DB006919CA1BB62183ECAEB2ABB3AC36C2B0B8DF
+ 005113D4153F33E5C95B09081D5D6FFDDA7C0D73474D0D96B82A88742E46E409
+ 57468D46CE70F416A7E93381D9CFE8DF0F96EF7B7D761DE2DAE757952D54B106
+ 7EEFC96FC2DFD35C470F7511F21CBC5F329D1D8093F892943293D9954892F190
+ 7304032D8F8ADF49EFFFB1B50147E012803E7B520CBEC669E53F311C2A7B720F
+ 89856C1E88EDD82DEF34C19CD4B2F08505C6A944197F7F4F6D6051EC14E7A8F7
+ 5C65340C5C98A4F9DA54F3BA669973833FF1CF1718C2AE57A881E111267606E7
+ 8952E6BB0712938318D829B8A1E808DE15EEF3C429496E7DD0637FF338DFFC26
+ 8FCCD5BF720928A048B9AE83C71B916AB6B6CCE6CA197D0D0BB24BCD7A5D1319
+ B34E8502176657B2BA376CDDD8951673E89C7260B341D54DBE90CD1DE8F24FE4
+ 43F96BD5A5B6B6C1B0F522B020E61EFD11E0B301F188888FEF8DC13A242DFEFC
+ 2B49CFB04D0AA049DC195DD62C024971AFE3233F07CF403BCCE4D87A86D59A00
+ DBC04335D93D15958CDD5713A8392DA8BE3D918872C75A30EC7873CBA9443C3D
+ 5E79C9FD02C4B98A41F8B7F1D09B71327706AFF32F737902D9E426937D1A3484
+ 75A643B2DD780B34C45578550E12ED15120BB1F461C637F55A7C07B0F9972EEB
+ 2FEC68ACE9B2F480321C4066CC4CA7CD43E5EFD3D357F692CF90F55481849D32
+ 6971EECD5F9387567AA0037580A12A9FEA24F48098FF3A322DAF34D997096044
+ CEB88D2E969625AEAD58CBE4EC1044BC1760AFEC1E7E3DE89CE5F0C9C3918B3E
+ 64976FE64555356407F4606FDB40C2F59D282F265EB13FAD7345F3E82DB4136C
+ 70AFD60AE365766319EA97B701A153F3303F66911A1B72A6E86CF3E686A58494
+ A4C904B6D9CA9C3590B61415DFAA1A5BCB0278970440D664A29A4D54DCC68552
+ A44A07C925B343EB69E1F88555779CDE32E5D2AE61006D8F250810C932D8F3AA
+ DF66B529DBD316206806B36EB7E47B379AB809266CCD80A776FB5495BEF6E5FD
+ DFE93F9C4B38FFD64171F51E11916B358988A31AE1F8E53CF04F93A18FA32555
+ 23218A110AD685B7B09A15E2FA350DC6A013314EEB2D0020B2AE24CB6C981850
+ 4F670E6BA34278E0A6E6E78E85592096CBD783F112FAD0502924D15B4817BF71
+ 56ACC52A93A8782606DDD46BFF18318CB9B6C91F489891C572703EF6C275B822
+ 9F96D7409687A229091A8ED3F7C386F0C0CC310F2BD54FFA26701F4186757FE5
+ DA83DC33CA4E910906CB09CA417134EDC9AD17C3BFA297033AA5EBEF68511237
+ 5F2D6755861E563217501E9BEC404BB7106D7049ED53BC001C118D1F882FBF1B
+ ECD28472BFD18B8F3F764C832BF4383D67F176C49EDC92EC39E2BB1FF108CC03
+ C4CD7CDAEE7A2EFD383FE14F782C7925CC9B9DF9C36C788F68E7AC19D8D17E49
+ E8AFAC4B38B4A688E528F0B88F8B8EEA032F94CB235E14753F20B84BBF4177FE
+ 37361844B75AFF49975C1A3305AEBD252011B9A15B94256774DDD60247B57240
+ 814B8BF73396CC11BA5A3882F6DBCD1E0C05BA587C91C6B349E5F6EBAB713B8D
+ CEC39FF93A8C24A7D2CE1606D2327736F289BD57C61C68F3B0EA7BD6144FC909
+ 97DB4946FFF83AB58ABE6C65102E73F5F438FF552838EDA7F4D8EF55544B3B86
+ B937E1E20EE0046C7B14DAC299CC7901988CEEF6F5EE551CBD927B33759631B3
+ CA5F5BC7F74602D210A3945B98FF24DE80C4DB6A0131162EF887E82064326566
+ 53C3E08AFD0A4329389E4D8E61F9941BF08096369ACD47AF8BAE45FD314EB0B4
+ 59406924D3536F298BBC88F58A5BCAC8F0C2EE7A8C6285E975A599DA5CE0B4DB
+ F0BC75FD16D4573C4B49C9B4719B94A53FF2D6625EFCE9DB421FAE3C35CA037E
+ EA095F5424E72C33747B30A01DD3C88C9BB1214E73D24889555E02574F099B27
+ 6C7B813E0FCCF2DB2EE1AA9B1D65B60DA241C75D9202DB82E54A9A885D2EAFDF
+ 91C4D72FCA99CE2FC07996AFE5CFA5109FB12FBCBE33FE4BB36EA2575F9059B2
+ 18A8FB1C8E0641F465BBD813C8F199C578BB85832BF0E83C2DD1FBE0DD3598F6
+ EB39B5908C65F5987BC091CD8B2578D4D727B2E7CD96202B159C1D79E6CF509F
+ 6AAA594E246C36453179A3116E168B37B3F59D7D45DF2634C3177A1CF7303785
+ 54EA13481B1C36CC4FB27F9DA91107E4AB011371C554A89D8A455A704555FF70
+ EAFC0B701756E9FC5BE78E067A7AD19B2F541BEA7D711C6649CABAC08F25ADB2
+ 801AF43CCB1CC01058354BE2AAF84BCC247890D62C1581B91AA9FC02463BE0D0
+ 66804D873505DE89017F60FD6F21CBAE762062CEB3D9AD08C37E7ECC2FB2B03C
+ F78E792908504C4CB32E5F962909BF783481D86C73AEBCA75E4BCD171B40E669
+ 1CD2C640585BC411B45D4EC80F6E4A3508E5E0CA2E3FF817F2044AB74BC7CF92
+ 1CB79998CE7B605E1F6F181F7480390A1CB7B32298DFBEA807D289ADA26A7CA2
+ E62AE9DF2FF5B0197452D2461CCC172278F9AD6D457B317FE83692060D422FD8
+ 96DE2FC0CE0A1139F2C854405E6FFEF2EF18EED1C3C58EFC8A0CC964E830056A
+ 1E77BCCF1A157882996BBB2658BEE155FC820E97FC2E253EBCD61A786A3F1C93
+ 1750A48790254126CBB82CC7090E53BB121574FBFD59B14158A065D8BDDFDAAE
+ BD0B4CE951BD57F8F4E643519A28152F9443011C0BF0F12E6A7569C419B6D485
+ 8AEF78D0DDC347418659AF8181E252CA8122B523648D1137C38999A14FBD216F
+ 3D2BB3434E46748968BD9FDC50BFF23D8BA8A4D0F784955605139F3EC4A98B4D
+ C633786D1B7D4791CF2FB923D8C37415DCBB1A3A1311D7B657A3DAA8E4349CD9
+ CEA2B9004E9B4336FDD62FE856816996FA5A01E53A68A03E4E652AD7BBA6DF65
+ 8B5F5CCC0237BF585269A65D519429A72C421FF4B1DF6C73D69275FDA202A81B
+ 780CC82CDE55858974C95DEDEBE6B5C906B878AC205806A5CFE7DB9592A091B2
+ E54A642817585EB40468CEE04E2E5F2393FBCBBA07002BE5236C26BEED5A0770
+ 7651103AAB9397D0E2745019506590D483199BAF6E988FF383C2534219B67C44
+ E48B84DDDE789D0037EC8DFCA470FAF5C61AC2390F292F32E6D3DA4BE54F244D
+ 015024A2E4C243B7116AE3867FBA2D8C08AAEA7A0489AC0C029BE32A376026C0
+ 2352780F7D54D31B94B816511C125DF666F4C81762041E2FADF3EAC8A9DDE4CF
+ BF39E35FB61FAF41A9FC0AF47FCC864CEC7A1419BF2A15309A30903BB2B1D5C9
+ 5C404D28F1B481A9010B50792618C394331851A3357EAEA717F5BE145845EA08
+ 85F24DFE683634E11A4AC97A2AB11C65E042793CC960BF6E7D65B9C8CD8C13D5
+ 65A38A34B803DEF21B42BCD32450DD49B2BDBD5E2C5963A6ADAAFE988D748A9C
+ 84B3DF094AA4791E144EC4C0BEAD0ABA9FC96C75327CBF30BADB7643148AAA9F
+ C8A7D5B575D8CBFB53239F9A07E84EBE172BDE92C59A93AE6A9450167CAB22CA
+ C55BA87553655362D4C168E7E1ED382685554EFA9027BF550E02BC1C4AE9702D
+ 35B7DB7BB20CDCFA1722B5A33DA69F94923CE7FDFEAE6641DBFFA87684BEE307
+ D78A4673072BB316CBED9C56CB83904DD091F39B6B0BD191917B2CB49197A236
+ 0C6D7B297EC39D56BF02EF7221673B1FD9EA88EC8B7568628F18AA30D28585B6
+ B218A93605EEBE2C6FD5F0BF5C57D33D75D6BA86E600BBD8340924043DE9E5BB
+ 07EEB08B4E39601EB4BAFAAFBBA106BA038EC4C784F0132DE39D2416626AB8FE
+ E307BA09C7F1A67BCECB38BDEDF90ADC25CD574399C340128B079B3FE183710E
+ 4249E228A5831EB3671E87B0B86C1B8438849B892B1EE8B4CA21B1E73D9A9D5E
+ 9FD57656923D30370E1969EC5C305F1A5554B9F3D07880CC858E37808E856348
+ FD0C7D8B1FD9662AEE12EC44E7D256ED603F2D397AC6D7D856A19D09E5CC1AA0
+ 3EDD3197AD482ABA6A65BA20BBE5E1914C3EBE33C6DD870724666857FFF0BC4B
+ D11F44A4C6C9C2D78D21F5031C234485A3D3D6A167496607DE49A37DFB5A2806
+ 310F0B1A2B5533B0E13AC57F477300612D97A1AAA652AA16B693693F511554B2
+ B509A50BABF95EECC857419C24E03BF95B491A47D51A085DD5096CC4F57527B6
+ C05D0EC35477A8F9ED4816958BBE4B10FACA7E0DE5E5D6543856AAD28013368F
+ C8BFA2B9C2B8BD1E2A2E0699CDE04B60163AA46BCA08FA2E44DFF9C1F752E165
+ 255E12473E3CBC8B8532EF83BE3DE2C4192A3950471F6B78D997FDA5D66C0732
+ 2648329DB9EFD54EB2A9143EB3B3DBBA8873B89CF7274E67336EB10F611547E2
+ 1BC6464DDDD278D7FB18AD9E6C8A159C0B9BEC458CDA2E523DC327BF764CC14F
+ 9DB84AF730742B9760669848C67C9634A1B5EED8E3A3E9F69C7765D0F3A4D1EA
+ 5E2A7D8584DA87635B2485BE7361FDDA67EE9ED3A1432D398A2FC9785107E14C
+ 16DC9371EEE5225D6A410CD5707999E3F2F9B7B1E22C53674C9F5FD2C2792DFC
+ 064F119E1EA4383EC4742CDF49A970F12E147002B1DAFB04BE6FB923F8287032
+ 3B111431D5D29A9DF9A1F021FC6FE892C453477723012394B648461D4216EDEC
+ 38086A038F951B54FCA8FA4ABB1068A5FB0F8B94367F5EB71A2F76B0B6066C3D
+ E582A8A29B429BBDD9DEFA2536BBF8305B97508D8297380D077B31CCCF18727E
+ 1AB38C6C29C249293BA8651D6DE15E0794A23204CC576C5DC363A6184B131E9B
+ 025D9580CA9117D6E22E6D3EE95E9740F96E78207A2C4C244A17ACC510267B54
+ CCDFAFD46FD3EF9665BC56A1E5DD7F1CB19554117C180EEAD7AC7A24B8652B7F
+ C50229157243D50F9A10820F87CF04F38E659DC4E73921867E624B4D6FAAF41C
+ E6518FC3E5E25AAC530273762B7A220A5CF18CCF34DA0CC5236009F38B7A5707
+ C7EE9046ABDD6CB5F8CFC710F805DEA8EAB0816909EA39F6F85762F8F33EFC14
+ A104D4451195269271503E9F4CFD31F1331CCA6FD72D20A835ABF553361BB75E
+ 50C550917A046E0C53BC2F68CE639FAD7F1B84E469CBAA0FDED113C76AFB7838
+ 74171F9ECB310D029D8C2BBF9DEF06A353E9982B41991AA7091436625C063556
+ 1DF45E9B80305ABD7E6332F2565B7E08D08EA136B36B9A487959E56D326FEAA0
+ 74303298D8F316C7A0E8C91CE4C27E60098D700D3D92EB44F6881743F392FD4C
+ 848E2EE6AEED5358CA69138A5005C48DAC58B81D621AA8441E8411A4766DEA0C
+ 15784091BE987D5A390648361420AB140531CC494BAE6EAC8554B2DD7767608D
+ EFD8429AE9578AF3BA94325EA0AAFE657E5432A077C702C311C42526F6852E22
+ D267EAE3091C2C00F45C4F72A57DBFD013E66E12B56C2B4ED84E42A4F18935C3
+ 7F0C5023B10002FBB3A255D91B686355D25F1E3D9CBA98665CD2DA403E5A24A1
+ 8042BB412544D04B0A0AEE7FB491D07B70A72971EB46082DA4A5BC320057723E
+ 105EDFED06DB5A9B830179083AB2167FE69B52FDF6CF84FB18D285A48537BCA2
+ F4B65B34ADEACB0094B36B5148B9E85F106C8599F743B00F45218F92352C1B9A
+ F46A711B4E09AAFE948B40DA1F3AFDD85D0675A37052659C337DB794F2F85EB2
+ 67977C0F85BA11EE160ADFF9E9A41B4ED74E0CA08BBA3D172DB4A21B17897BD7
+ 4B2DE5C280EAEEAF4DA19DBA38DFF4C4A500F445881FB4203CD7033BD092BC95
+ 381103BC285F0D0DB11EB54C980C1722107F973A5F56232CC81AC6F87FBB6D34
+ 9F4426F55A7F161EC93278693B8172AD05BBEFF3F70DC6FB3FBCA9DB4991196F
+ D40BF6180A02CEA089A25770074C10ED3003733136ECF2E2DDD39122B425BDD4
+ C60AEEA6920225598DA7A55FED67A00967EC9139C9876B42DB6505449B303F60
+ EF9F415A59247063B1A681DDFBA48E8C15EF3931B9E37A2A395F676D02B7CA92
+ 1B4401D59FD58A54376A9E7FC2B075EEED03038B5AC7D886B98072302E041728
+ 1A684659B8927A7FDAC0CC4801F5BF17052E7BFF36A84B69CA3E37D6650B7ADC
+ 64AE6F2AB661AE2BB94C25789EC0B9CFF6785C6ACD2BCCC794951AE72AB4162A
+ C9ED285A0090EC3ABAB1D9C37AE8031BBF4CAF259B2FBC365833F318EBDFF052
+ D908189D8F85AF4F44F19A6A8E4D676190E8634CE5C974575CE7AE12F5220FAF
+ 0EA1587B9CFF9CFD5D888A6C383B74B85C93CE6DC9E4F32EE02CFF1DC775BC0D
+ 44B584691580BF0392757C6F8E4ABB96A3E6BECB83E114A23ADEC6D7B577D929
+ 455E3A542EAF607E99CF4E731C20C9AB11D2D9F5354281CD4A1B46ADD4276207
+ 465B6A0C86C08A65A4EC9459D739F6CC17C05CED381AA877B9D8B8F0EC14FBEE
+ 01FC4EDDAD6467E5FFE4977BE7928E36F5CCC0B0B0735912E0CF28F7DFAAD374
+ AC88729F414B98A5EEC78764792506029139A23332777255A8871601688C3985
+ 9C72C2CCF7917BC80E417BF2BDC9378F527E9252A04CDA8215C1771F8BE11045
+ 88864914D7BE3D8659D30F115EB4B0B1EFF33BA172ECB7C42DA6AFFF2C3219A9
+ 04BC2F733910D42EE64A627395D23FF35AA0B50E1D50116CC65E27529446AD5F
+ E2DB57E93252F0CB8399E41188F97A7C0A45F3AB5C2122292A968487ECCD93D6
+ 353ED05012FD72A77DA20F7C26480ECFBC909391DC6547D152B2B724B65A5697
+ D80096CAA254CF347363110350AB8EC55BB2838B8D9C22A51F5FAEED065BD7A9
+ 5E746C72E60AE86083273370F43662DF1E84680FFE0A8271B040A2E9DA40253B
+ FC0272EA8E1AC7EB0E1D5461E233B0237D01A488B277A4158F169D4D2A476A94
+ B40033C2F92C7086C03209BC7855C0039C276414022C283A5D1D7E94C08A679B
+ 6F7A2D56E9627B7399EDB99A85F31F1D99C30EE3E11A6161DC2E507B44083B7B
+ F3544BCA72D3931095F9E1D9805AACC4EFCF01B71F213FD52110CBB9BC5C9642
+ 9FCDCB6A8A15E2D23B6B8DFC29A98A21304B37D12177830C55CE8916B1A3F79D
+ BAA8822F754A096F324C7EBD37A2DB0A6B7F0246F4C71F573822E668D8F159AE
+ 9DC78DCA9E267BF6BF6144B56ECFBCBF76B3019D968D39D326712CC30F40A7EE
+ 071102338C6F13EA782AC6C2232BDB3FBDD568F7E5AC09724CDF1C6C1542399C
+ 53CA1523234195DAC3CAF86FA7808EC32A33B45FF5970295AE62498A625801A0
+ B388C6A369B1C63ED1BB9C8C42EEC128F7E7B90EA992E98C00227C51921142A0
+ 7DC7778F66C6F9902FC4796B822C8608ED0F2C3804FF1383615A720A64F4D675
+ 4F66E70B1A1D03D807DF2DCDDD82EB79F866CA9D8DBEB150AC4B00287AEADF91
+ 9CD91007F5EF236C864999DFF5C590A52EF3E6A731D5F91EE65EBE0C175A8B3A
+ 81435815CB2104885EDF5D61615CD7F7988409ABC4EAEBC3D3BA6DF4988F4D4B
+ 60612E29560DB4CDF5386FF79045445DA7B048ADC9056C8F9F85FC78006C8CDF
+ B62ABC9FA839F3819FE4671FD6E7C983988F69432C3AA663CCB4A3099BAC64D8
+ AC46799EBAEA90D005D2453E484888B3CB356C3873AE4C6AFE73D3E620503742
+ 3044116E4D38951DB45927B572ADB6311E5DBA3282BDC156436E890F7AEB0A91
+ 6A1D3519DF7DB8A6464A4613C9D5B2EE23B425A835F99D4A1C6FFCDA596354CA
+ 717A02FDB8E54A6B92AB1604AD137292BA6F04F363BA8557800A1A7D535A4C84
+ 934FF4A6A323409693ED362E3A3615A5CEE80AE04E135AA7ADF66A8715C7BA5D
+ C6538E5FDE966EAFA9E1CE6157F302C577E14419DCA92DB02C2976D469EA15E0
+ AED1E4528404D76E3A5544F9AA04656A89E71343CE8F2D39B90C7AC61E3E9512
+ 5F2721C3DDE262678A322B9581C15CB1251681039EE182349A293BFEF841DE35
+ BC11AD46696F3C3FA0938C29DEEE5773BCCF947451A48FE6340447A63621161D
+ 19C15363809A20F7CBAEE0BF0690F3F41358A59DCF8E3C858184F73C03638C4A
+ E564749D4B1DE5369388D35DA8F0C03FC7CD7D2BBF5E682BB351DF0F261825F4
+ 9CC6AFF4A58F9CD894E2C740657F7C1703237EDAD4654B7B210656A2F82AD030
+ 25006DAEE28FD2840285716D1756AA5472EF1A37A94366C137DF621A0338EC1A
+ 5E3A5ADD5698C6FD5256693092C6BC3555DB5B77FB1809ED485C3BA3A48E818D
+ 6914DBECA9015326710814C1337F91FAE28817D582CFA8F8B780048BD564987C
+ 325EDB7E78FDF393C15C2DC3D7D6D0E89B707BAC927BFD9F5460879E1281C00E
+ 9D34914E9F37FCE3467D254670943B81C2F17AB9229223237F01BA1813C4478B
+ 544C07045E3CDEF63CC7F801A5D66C3E3F06F33F20EE403E8922ECAE1C017F79
+ 6F3B2EC0804BBF4666186C1700488986CD517D78545683FD12D7F29635AE4B5C
+ 9A2F7B6FF3DD44720483DB73115C0D16B9D3457AB36D5A918165FCB6F60BDBCB
+ 4DCDFEDD1D12EC01057D28D1280D57CE53FE9B0CFA511D43EBADEACA6B77483F
+ 7A4F113B4B063CD964AB10822B4B4D9CA9E93E6B30B07A4E875E47526C7145D4
+ BBA663B4B4322218714CAE1524B31E6FF6B46749B979C7E2449BE7A13C3EEDC8
+ 89F1B8D7342040BE9CB20776D22FE2E2FA87F9C6F2D71584FF9933C4348E1B71
+ DA9918C14CC1D32FF88A35800981F83AB522919C130D20F13314C7C739AEA9A8
+ B4357C1D93AD3831F9C59679FDB704BF0206807D6E0C1B108B8A3DBA57E32215
+ 19F65F574E732BF346E910199918446E88BB77DDE720C300F68AC39352235A9D
+ 937C638A40E014108DBE8652F25ED6D02BF45BBC8D087AE82B688B47174DD099
+ 1722607B10311EBB4524D2FE142BE180356D007D282FC31EA61A07691C73220C
+ AC1D6C260A554BC1A1AFB22583F1BC572C769E6F55528AD1F78AAC29F1BEB78B
+ 2691DC306C60ECBE440900D709EC33CF4FDD2D80F572EFA7C4FD3BBF3022BAC0
+ 5B4B8F29D84E6E0089D0E5690245B99C88C0B7F62944354AEC19994BD44DAFC4
+ CC977CAF5B314E5798AF6449B49DC26617D5B7CB0DCB35272A6C1345763B329E
+ F558CC021CAB2572E01CDB57D472D2606E3357F6AE
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMR12
+ %!PS-AdobeFont-1.1: CMR12 1.0
+ %%CreationDate: 1991 Aug 20 16:38:05
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMR12) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMR12 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 11 /ff put
+ dup 12 /fi put
+ dup 13 /fl put
+ dup 14 /ffi put
+ dup 19 /acute put
+ dup 20 /caron put
+ dup 33 /exclam put
+ dup 34 /quotedblright put
+ dup 35 /numbersign put
+ dup 37 /percent put
+ dup 38 /ampersand put
+ dup 39 /quoteright put
+ dup 40 /parenleft put
+ dup 41 /parenright put
+ dup 43 /plus put
+ dup 44 /comma put
+ dup 45 /hyphen put
+ dup 46 /period put
+ dup 47 /slash put
+ dup 48 /zero put
+ dup 49 /one put
+ dup 50 /two put
+ dup 51 /three put
+ dup 52 /four put
+ dup 53 /five put
+ dup 54 /six put
+ dup 55 /seven put
+ dup 56 /eight put
+ dup 57 /nine put
+ dup 58 /colon put
+ dup 59 /semicolon put
+ dup 63 /question put
+ dup 65 /A put
+ dup 66 /B put
+ dup 67 /C put
+ dup 68 /D put
+ dup 69 /E put
+ dup 70 /F put
+ dup 71 /G put
+ dup 72 /H put
+ dup 73 /I put
+ dup 74 /J put
+ dup 75 /K put
+ dup 76 /L put
+ dup 77 /M put
+ dup 78 /N put
+ dup 79 /O put
+ dup 80 /P put
+ dup 81 /Q put
+ dup 82 /R put
+ dup 83 /S put
+ dup 84 /T put
+ dup 85 /U put
+ dup 86 /V put
+ dup 87 /W put
+ dup 91 /bracketleft put
+ dup 92 /quotedblleft put
+ dup 93 /bracketright put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 106 /j put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 113 /q put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 118 /v put
+ dup 119 /w put
+ dup 120 /x put
+ dup 121 /y put
+ dup 122 /z put
+ dup 123 /endash put
+ dup 124 /emdash put
+ readonly def
+ /FontBBox{-34 -251 988 750}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C
+ 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361
+ 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA04C77322EB2E6A79D73DC194E
+ 59C120A2DABB9BF72E2CF256DD6EB54EECBA588101ABD933B57CE8A3A0D16B28
+ 51D7494F73096DF53BDC66BBF896B587DF9643317D5F610CD9088F9849126F23
+ DDE030F7B277DD99055C8B119CAE9C99158AC4E150CDFC2C66ED92EBB4CC092A
+ AA078CE16247A1335AD332DAA950D20395A7384C33FF72EAA31A5B89766E635F
+ 45C4C068AD7EE867398F0381B07CB94D29FF097D59FF9961D195A948E3D87C31
+ 821E9295A56D21875B41988F7A16A1587050C3C71B4E4355BB37F255D6B237CE
+ 96F25467F70FA19E0F85785FF49068949CCC79F2F8AE57D5F79BB9C5CF5EED5D
+ 9857B9967D9B96CDCF73D5D65FF75AFABB66734018BAE264597220C89FD17379
+ 26764A9302D078B4EB0E29178C878FD61007EEA2DDB119AE88C57ECFEF4B71E4
+ 140A34951DDC3568A84CC92371A789021A103A1A347050FDA6ECF7903F67D213
+ 1D0C7C474A9053866E9C88E65E6932BA87A73686EAB0019389F84D159809C498
+ 1E7A30ED942EB211B00DBFF5BCC720F4E276C3339B31B6EABBB078430E6A09BB
+ 377D3061A20B1EB98796B8607EECBC699445EAA866C38E03ED7D4F3EDBCA1926
+ 2AF6A41F67AFCFBF3630C943FA111E4CCD988A7363F7C2B75EAF5830B049460E
+ 0D2B337988F150B9182E989E7750C51BA83DF37685483F86D1F47478883F3F6A
+ 4B7F768DA5AA89E8F163029ADD4A9209DE8A4F285766C06EA859639B92CCCDCA
+ F59B1C2BB8D588CA754D1257BFF76B53984DF4937093AAEF79009D32A29A4C16
+ FB610C7D6713482C48D7F9E8410C0F00AD6E67021056B6035534E79F05D14EF2
+ 4E8D84D2752D8F045357E228D6C524C1BA8A9275928F05E0266E33244B83F87F
+ 439373EE3592D1F67CFB92F600E4EF17479E8BE2789AE58847313D47C043CD4D
+ CA208AE5F065FD65B0F98089371BA69CF9E71E11B4978EAAC3E76B662C07C499
+ 1A3612FEF1F3EF655753301B26EC3C9EAC80E059AACD02BB342298919CA1811F
+ 5936EB5DD49E3C13FEF7643CB20284C4427E9DB26142DA769FD783D749F897BF
+ 89CB39A297CC4FF9030FD615C632548C9DA775D662AB07CBB7DE18D1BDD79520
+ 4F6351444D32BA3864E67BBBA2C9B272E4609C5B5E9CA20A27006DF7A3C2A568
+ D34DD46A982A7FA68B008E1302005C4CF5E4586A414EC416FC0B3571AACA2190
+ B5E34ACD63A3D14E3956A65F17DD2A2CC864BE4C151A462A150C70C32F259458
+ B695C0D93E2EAEB224974D830A3CDD32D7807C49B59F6DCB22F7E4E7589CDFA1
+ 685029E400D89821C50950D7DDEB973E9B00CCB038378C190EEBB2A3D723BACE
+ C763CD9AC935848A2DC88AD210365DFD0CF7447D84B2304B60C34473A04BE623
+ BD46729012874FA15AAF93CE093144E1AD8170BF5A34721B37001E42224CCD28
+ 2F6C55FF98CD66D67F98A0B338A4D4E43D7739D2E00D767969498C436F8FC1DA
+ E5CE9607D8B9CA4C38890606BE1519587541CB68AD45D85AC943E10A1D039153
+ 798C7A4180276FC18D32EBEEFBB4E9BFA70FDF48C4B31D5139C4628FA8B53FC4
+ C54A6008DE70A21759926FABD0DB0878065F87BE287D716DD9B6E6AA7FA298C4
+ 876643033458EF57ABEB17F2F98D59DBC43DC5EEF80E335EFF44EA3900618C9E
+ 9D7D5FB573F01D36831FBC6B8240A3C1BAAB434D586C9D59A497F38AA7F8B892
+ 84E42754484BBB332FF00EE683F2C4E6F866F8E128739E44B82C1E765CB54495
+ C5F03B51A386FDDFDE72D98613DF4062F3E8F77FE610F4DA4BEE0AE3DACF2A85
+ 32F48EEFD5222D39208850F85FAD9AC27E3E924A817522665DEBCA359458BF10
+ 30356122D5F85179180E810336DEDFD8EF2C10A9D3D44030E5811814121F01A2
+ 5FE474EB6DEB645F499A77430B4B3EE2DB0CC8D0E0DECD34E1E678BDEFB596CF
+ 51E055D7417E556254093F795556A9C38A7D4628B8CA9C30CA0B197A744D3BDC
+ 58880A525B9920C7CBF88B350ED515CDD61593444AAE929C7CB12D3B101779BF
+ 563434B7E98ADB7F51C1EEEA902A4097C1ED31958B3B671BC19D2CC34AF9C461
+ 1E31A282F1D38A0B4B36307527BE00B014A59E4CC693C828948D0557BEBA3804
+ B2384CECA42F3270C969124DF3F1EF2D2A4CBCE4198D08BE0118EA41AA285BCD
+ ACE6D324E4049C2F0DF101270F0CD2BD90B94C150BC48FE227A5EBC5A1D58440
+ 12DCA12FCD3DD9E624BAD8623A6611899FE57277BE78792840B45ABC4F83A6FD
+ 98FEA04A5F366DADD81C7C40243B35FF4E737561BA98CD4D401AD431A7ADFE47
+ 943E7D21B45603B02D08EF75165CD98694A8AC8695AE9D748DEB13BC59A2B90E
+ 51957FFF19363D66BD5B32F22CAB720C2E2AA456745D8E72C2E93CE30AF4309A
+ 49CC99DEE59AC15C512271F552768CDCAE82AB40BC13985BB65623769268B890
+ 42414FC30B2DC0578CC4F7DA38CCF5329828FFA6BE1B8372F734FCB199C1D7F1
+ 55E5DD86EFA72C77DDB878F06D76D56D075541A7EE3BA82E080797997941B9BF
+ 598228A0CD7566E80F35F30E87197A40863BAE4F6FA882DFF6F37C19A6DCCEE4
+ 56D6D715E7730901234985838BABA097500450940976B7B997FF26440A7F1147
+ 769C0FAC7D15EED3FD6DAE978E9B35462E843EBB9A93C30DF1BE8CA49197DA73
+ FE5F8E2843894142AD5192336CFB56013B43749B029CC8B36D81E22559AF60C9
+ B98053918B97149B9D1DB4B602830A4601794E7D47B40219399D55AAC92BABFE
+ 46974FA831AEFE0B959CEE5C923438E183DF0C53D5FF1AFAE229F971D44EB4D1
+ 7CE42E76D68A08B4E23D06291D9BB022AA825D57EFBE0A210C3377BEA3924FC9
+ 304AF9EB8BF56F0997C06FBBF78654FABD021E7415C41D36FB50A9EBD7B0D9D0
+ 5177AFD06A3BEE00071F267E91386A3124FDC05450EB038DAF6CF569B86F99C8
+ FDC06A0054DA09CA4C7D5C028CC8D6B3A4FFC8898DF555367C1ECD3DED6559D6
+ 929C059285D44AF96E1DCFF651534099894662082B418B3EA72F1BB619C0E85F
+ 8D8995764BAAD8AECF4153A0AC5C0A47FA92A7AAECA7EB9DEC1BC57599E48B1C
+ 8CBE4F756D8D52115D7F95EE9260030935222F7CAB801855293DCB2567A6DD24
+ 680BA9055740FA323AC8A5B6C2A981C940366E072CB1A83D0BB93BE7BF99A277
+ FDAC3C652E4830F9EB19F6DE5620DFDD8B2D4A0C7D45B13E55945B230EA19C75
+ 3A058D520459913D1BEFD3F48E4EF2AED14D5532A9295A075C174B2B6E599C4F
+ 1749B4B5F9448A26A39A36A1F6E4AAE2B431D88386CF5FD5620627813287ADD0
+ 713B48B0B30A03B021BEF91C1D853DB2FC7C9D1F66481260B198308C06E7308D
+ D1D850BE8EE80E2B7BEE0A95AE7C331BA622AF14340EB58E9040F85DD7994555
+ D082A7A7F2733301D961B41404B89CA836407E60D95B061E5B59B215FE9FCAA9
+ 81C060ABC4E555A08D3BDFBD872D682741B933DD506149CB72C344BAB39D4834
+ 315AA929E173FF7CB1E3B491366FCBC15BBAC8F42E1631F04B7C8FC6CE2EDE71
+ D835B94433F390FCB674195F36B3AC6E12058421E838322EFA98D3BBD133F387
+ EF902F40E0FCDAF2F0AA4CF8543D7380FC50E29A8C89DD0EE2593AC8609CF48C
+ 5C8B6289AD4BA437C8FFCC17879B8EEC98410D984D3F934960E31F8E893BD8BC
+ 9003F929C4D075671B54C0A8F1640E94ADCB40783B0B1DC00CAC66B219E75339
+ ED8C34BD2E22EC392CFF0E1066248AFA19E9078BA327D9F704D70FA81D745A32
+ 9D2357C5C21B9DDB3BF4ABD38FB53C6C329B806FB05112A2299516A6EFA1BF00
+ BF0A6EC64A84F1A5D988AA1C53EC250321AAF3CCF1C1DE8129CD81CE83EE8DCA
+ 53E51ECA95D780A7FFA2DEFC47194C452417ADE1FA0643AAE631677730E29576
+ 0ABB66E50DC3AD1B26CE77CAE9B6175EB4399CB7E1B1D55711E8FB42AE546F0C
+ DAF5FF169828E5536AC2053BD297DD354789D7BEC4E8133687697BBB4A45E8F2
+ 163CF79FE41AC2B2608A6EA327F0556787D1AFACB5189EF2BF7C904E5B8B2BE5
+ 898EB8A0049CF13235C4CB28425D77CEB56FC52F396994A5F45AF5B0515AC3E6
+ 0ED2A6901AF81765C965B0D5550E8BE0DD2B7A0A343E26EEEECC9941CA489A95
+ 3DD318205C16FE432CCD5611E48F9EE6FD1353B7F32B5200A2224F1074073D8C
+ 09726729AFCAA15BA5C5640DDEE152AAB8790C80150DE4E3F37F144690AC1DD4
+ EB0D0AC1097D340D5A03C526F3E7984286DB69A7A547787CA919FC8AA60EB055
+ 0E08B9C800173BBAF3D6B0D3597BD1BCB69F71A5BE2F44EA379D77304AAE1098
+ 7B3EF6AD98DB13B361621F6F10D061BFC906E291506BB1F709D9A01CE2E76A85
+ F10700C50615065FBF09DA78D20F1871A61E2E7EA8895CE72634BAD190EE0A01
+ D5BA80218ADD5AB286AEF7E8109F187AF5E279DAEFA90FAE56BD2022E2FBAAF5
+ 0A8883CE25E4F7913849CBE6627194B57A75AA4C5B6F3F90B009550E9F1A4A5B
+ C6B4664D90AD12BDF4D8DBB1F42FDE9E30DA278FE6A5B34189E5E526EF6D2FF3
+ EFF5C8C5578856EA8F626964841CFFF32B5340CB8ADF298A887D7438BB1A5F79
+ 7AE8CD847442D3E5E18D1E51A001C9641828757493737D74803CC81F3E11AB1F
+ 99FA9358E70A29FD0BAA350923E67053F975685CE01228153F2F031106F6CEDB
+ F64C08EC35C683D276EBBDA86E25E57BF0F714D298B2C357E75841CC6C1A8778
+ 54BECC8C4E30D7F378B8895D73799F2C4ADF46F2324B6CD1E9DC57986C8FBEC6
+ F016AFA5AC4A4C6D98A163F273DB0DEF48741524BE2ED22EDB5D26EA138CB53D
+ 4ECE466B30385E95FC597BF5CBEE538548A1D6D3DC32A31317AEBBB843D9040B
+ D6102FD87A4FF902E3BD306177EB0EAA885BA39031A623143622551284C979F3
+ 6C81021F167FE80A05A266E189D76E00F4665B076768A77904E3CEAA3112EC10
+ 4D6AD3148D2CA70083B61410A75C88043CE4B399D3C1697C8A8C66BA9537F6E1
+ 29446269B3E81EA2D5D8FCA4687678D1B30B561482E24870865001E96CD2F8BD
+ 3716D706B19EA64F8D5069F51D59E7E1551FC3EBAF4D77FE94E1FD50369CC01F
+ 58B5293ABBA9337D7A49159168AA08F4D85A207475B9522DB58612E7C5883348
+ 151F0768FC015A54AEBE8D52B5DAC79285B40AC6CD222CA845E4AF76B11A4B9D
+ FEE732C3E48F190F5C85E0C05DA0E4E760D39AA904662A4C01BDD098A98381D3
+ 5A0E5B5F63ADA34BF9AD9D54F2F1959F41185C4819AD605C87F8C39D8D434B53
+ 63FF5F0F3AF08FFBFBF25B814D180DB9750729F7C4962472299AD4FF6A6F3491
+ 2820571058B7D453BBDC057566A9BA1A03F078F969578AAC9709D3CAF61FD5EB
+ 5AC81EE6D84DD677A25880F13F51A4EDDE56E06CB515C90D0E5E580C20B4C81E
+ 254E408CE8CB6FDFF95F09D7494D823B81420FDA7CA7CAD1784543AD07766BF9
+ AB6DDA41C05E46D3DDD5C7F319C96DE7D5A88FC4A12AA88525C287749B0974E0
+ 22D179EE6CCBBF57BD468297269F3122AA825D57F5D630ED4E114319E224E9A1
+ DAF93BA2C44C02B46556369A5A1D8FEF84193969DEE0C1F4EC85849ADD6B9FE1
+ 8C0AE258EB7670AE5593DC1079D5901ADA97B36F014371B6F9C7CE05C4208360
+ 0F3D9C4D090FC044F4E9CC65D13D851486CBCCD31D96523B570FDA0651978294
+ 25C56D50B49AB0B6913F0FFCCFAC9DDDE1FC1423BDD4AE13FF0DD3FE319F0D23
+ B26C6B685B4A575E57C5C479FC6B97FABF12D8B10F4F3CBDDEF0D20A1520919C
+ 0B69F5BF6D14579C856C72F4FB38CF95755219926F4507878E0DD4AB31D8662F
+ 7B0FD33F7373D5AF08A58669F754991EFAFC59D9E47DD68FFB93330FB23B159B
+ 924A250A3C3C1EB54DCABB2F044C8E8142AA18ADBC078C2FD893310CA88D1263
+ 1E926A29861FC950CF4FEA5007C23BA57754440CC75C5F4B58CDB35A51B81A7D
+ 3B005945ED20019AF96618BF35A10A86EFB038100728E38271FB9370DA27B1E7
+ 7EF3285816C5CBA3D432960EFD3DBDF5FAB9218042728AC42021C2CA0694658B
+ 93B661E6173EDC7DF376D121CFDAD8BFD09A8FB0F7D942111BF1330C4CBFDE42
+ 455F1133ED4DBF4EC1E8632585ED7A9A99C25095212E88DFC15271CE6E5CAFD4
+ C2D095AA1B0CB6EB9E2BEBA687F2F5BE59E849687932ECBF6F38196E90538FD7
+ 56F32F7D97A96C06D967177913AA3792365BD539ED2DBFAB31008FB9E7E32647
+ 97C1E6A2D84EBDEF5BE0C8B70B39EF05F5600BCA3A037791C2414DDDE4EDB32E
+ 30C710A9C86065DEBDC463E7BEAF5988619B88994EDE3495E750CF60182D618A
+ 410B4A5869E48E62FD84759EB89E1EDCEA49C3D0FEB504DEE0AF8E3B0BA466EC
+ 67F3EB38F433EE0D0FB84D28470E9DC540AA88E5D6144188988AEE3247D729EE
+ 0BF4543E3CA51D2142A92C09D04EE9A5279DF351D1D83CF0D48690332A173986
+ 4A44302F4E7F220A153F1DC73A1AADACB821655335515270C2655F47053A4B88
+ ED5FA5BDDDC3592AD4FA7A7F6478BBD8678E3302E9BF0DD2183D2518D2075CC3
+ EA4FB302005CE23EAE2B4E6899A96CABECB40CC97AEA90AB90E3FC7A82C913E7
+ 2EE33E3356CFC785F3854E7EEB3A10592F70DBA44887F07524E3F5FCA239F776
+ 081ECA64DFBC72A83F47970FD39577D864A925A7688EE517460008E264AE7FDC
+ BDC111596FB19EABFC79282C3A23B9609CB0F7C27920C8F63260DAE8A18AE4A6
+ CC228428A295B4022EEF7D4AB711E19A8A43ABD4A4EC9955C174BEC4C02419A8
+ C734DD06BE6795D6BD45A62D64115FCC4DC46EE5A6311BCAABCFC5BA43BD81EC
+ EE6784C1501AA97C51957E5D50AE4AAB7A37FDF7C041115C75B219CB6D96D7F6
+ CBBCC8E9931357F0EC3CC9847C4DDDF96E86EF38E81CFD80C28D78FCAE155717
+ DB398B9372C13EA41CA47E1CD57361F0A3BCFFE8B252059EEB98D42FFA7A7F64
+ 78AD0EAC41C4F493595747F1FC0AE72F6D0E335F08895FFED8BC078B005AF518
+ CC723762CEAABC199E214951073CA82922C68B7BB9DCC67467BFF7E5027E21BF
+ D8BCECC2FF0FDE00B69F10AA6F0AC9047F02772084DDEF276A4899423DC732BA
+ 3DE24D1DC6BA7E6E45DE8FE29DEA13C9D98106A56530EFFA3A5175F90F45FEDD
+ 1F88FAFB3F0C516A378C0EAC4D434D3489F74C00AEC5CCDCF46590AA9786AC54
+ D87524BDEE0D9E2010567FAB985C477B46E3530D0B199C9B15DE505D66B1D3D7
+ A32996982F85DA7E9F93DBFBDA5063A2E59AACAA1261DA956F7B6F04C16B84A9
+ C5B88D30203B99657C38888BAE2CA2DA7BDF41C85E493E75042031F8E29650D3
+ 861B55053E17193DD0F5DEF7711BC178978D75D326CDB77BA09115AB5E9467BC
+ 3AA8C8B23F76625755E1E6F7D522C5667EA01BDABB605351E9998258DDA142FA
+ DE3974FC26C4E2845C4CB99B0248F1D010C686D978CD17947AC7C721653855DE
+ D2A56DE260458B76063BDDB321D2DACAC86774BF00B4405743D34CFDD1E82559
+ 5C6F318A7670CE18AB6BA1CBF9FED85E64BED526BFEDE8194762E6E6025FDE1A
+ 44A12DB62FED7BCF27FE423F5DEC4F4B403F6FA55C90607C1BD5A21841F50BFC
+ B1BC3494C1309A97E78BC9BF84EC68138905B9842E01DE9472FDAD464EBB87C5
+ B2EC16ABDF0197EDA37514104B6BDCE20DBFAF34B9E2F39A3FF2C604D803A029
+ E35451C8188D99F7F0E9D79509B7355A05023685198520ED49624274B0C47A04
+ 5C7AA946CBCD3A7DFA085A1E430BA17480FC55AEEAD59C8CA67961C0E64E5F88
+ C9486212A5BF933E0254AF6E72406FC07C56F5A95A95DE4F86320FA9415DC20C
+ 5DAA59B8108FFFD759B2DB5760B442C522D3CBB03D9EB5B2BF96F09B18725B3D
+ 7D955F74CAFF79B484D0AF024A41B37882526B8FAB8AE3017E5E213956D41B6F
+ EA9D33653E899E39B91116B2D8B5C720CAE04E714EE25313CC7FD28E063D9658
+ D1F16E4743F494E01229826CDE518E563C5FD566A76E829E3765A83E761972BF
+ F49D5F27DA63C64E8969B1603D53D6ECF22021C842665A44543CC5D10BCAB416
+ C499AFAA97063749365E0AD5E5325778427067CA0B3693891CA36913FB78997A
+ 89C7E30EEC37187E2042CC97EEF2163667F2DF7148BBE4B20C0E128E06B68917
+ CCF8B7367C91237C7E1598C9B40F02E709A117DEDC8891415071DB11E8D2B223
+ 649C65F33D947DB0DD9FAACE546C749F332FFF8D62AEF2E95FE9FE16876DBD3B
+ 0F369792C733AE136D1D0D6D6B0FBE8CCA3E9A63B07655D7887455A067B79BAE
+ 42DBE07297B1FF3E9972A7C107AADA393BA7D8FE546A207AAD8AFD08D2F78166
+ 845A4852F14100CCA9D693E2D338797A8CFD71C427AFA6CB56E808A2CBFF82D1
+ 1C96E0CD59E730DBDA85DB7B89BED023698AB4FF3B3A8487089BC86C890F23D4
+ 0FBDDD5869EB17923CBD5134ABB78E3BC4B5228BB1378342EF548171A05249CC
+ 0E65DCE19F5AA16C8406F4833316A899A767E81288C98841A3C1839ADC40C53B
+ DC6A376EB45954B08BB76BEBF832957E8001F0B17440AF40A09E159D20F10230
+ 21EB217DC565042350D5251A224C4B633ED31653FA5ED9C10612D884C770CACA
+ 29ED75B82119C579DF99F8CFD117BF8F5FE39E9D4E592C63663C9A854F729FDE
+ A48094CDD9E0FE65E0528D97E691E585BD01B3145CDF71AD1F342ADC9C2F49C8
+ C8A3C50084840847C2362D97270D618368B4134DD46CE818F85FF92EC2108F3B
+ 783E9B854931E91D9EC92999D081F7749652C7939F9D7E0CE8616F120D70AF04
+ E4C8FA47A18DF3EE82E665E0CEFE51CA9AC2A37BDDF89F8A910442DA4F19654C
+ AE1A774695A4827F491ADBB47925438C7660438A41AACC39044E6BB565B6D793
+ BEC2B5B08781CE6F29164C7A4638EDF9700D345C5A02B626643CA18FA508F315
+ 79D3F35EFF8CD6805395B40FDD2D4A851E78A3407B560716B54380612CA3052B
+ FAF3F736992DBE4EC84FD8D15D6FC96884E9473EEF7ED232DAD6593B6AE819C8
+ B65E46FDB8EF933F05331D7EEC5CA1311CB61FAC5C88D4061F89D5DF129D8A29
+ 29BCC5489D70BDF5FE8ED17990AD517D01662D8BFA24D405DAB40C25FD93563A
+ 15436F51940368CC39A262A326DFD644FE4FBE2F708C43AF314647E680B0CC65
+ 41CE075DB74AF81948EDDDC62FEF7FA9A5E3567B8DD80EFFD58ED1ED84B2DB0A
+ 5B211389560620714F291A39B33DF22930FBD696BE31B74C0FF90725266BE805
+ E157EDCFFF61622835B789D8DB0D5E2084913E4CD37B126E61374649B011DE49
+ 9FD1B970D5D127429335141915770A0EF9662885145E22031E924D2F3B6AD56E
+ 098C9322DE903C03FA41F77FE32715C2FB22FDE50A726F543A85D27CB87B8436
+ 3C42C82D7D033B000981C13B34F79FCCB82D4786FC6D006787351F54BC3519C4
+ 59BC8CDAC7F3B6E737A555B56F823A8FE6EE8281F73808B6A0C0927753760557
+ 434101E9213CFF406847ABF5193396CE49AD779AA2AF1CEF4CA60B41975211BF
+ 33DCFCECB592F48C662A3824DF2AAC05BB3A8A6B4B12E8D836F83B32E098C122
+ 80D02F84F31359C77FCB851CA68400437E3D7847031CC02CA4510E58CAC275DF
+ 9B6E49B3763627BD9D84B8DA1E58ACD45E278F3F01B29B8C978EA8E8E8C568D8
+ E1508B53093C57A58AA9622E93519F79DE7DB3262C145AB79BE5823B7A0D05A5
+ A3A24EEBF7EF2734D119AD8E78717E05EECFF3E4293BC98D00B664D5EBB6404A
+ 2F25D37C2C8F81A72BAE406D7A982C8B57D66A9093BA90760A228E6D0C633B8A
+ 1403EF494A6B3ED5457D657FE5EED6966E5D82381E03AACCE67E3AE741AFD81B
+ CFA69D6E9F7A8A9394BAB598833BF436158F6EBD74CD52D03F1C5EC043DAA3C0
+ 92750E6AD8331F2E0B91E447990D39BCFEAE8B10F02560DD7F117C8BC15D1ACB
+ 1EB791690C0F9A46F0F6984ABD85DCCC04540236E1E22195961EF1263DA8C995
+ 54A7B8598B5106956A195622202AF0739B62E46D7B26480C6822B93280C05F54
+ DE812A94727507BDE42F0A10B7BB1182012441BB2A5F03C00820B4FC229C9EC5
+ FEE09AF26B4B470C5E86360372F7CA6A3D84689E30E77EE25CA43DA900A87398
+ FD6D7AA4CE77CF2C0A6554CBFF6749B10B17D5F72EA70F4F3DD5517C2C599698
+ 09D2715E346C35EBC0A206AFE419FEC1575AB38DEC892DCB0F07110C03A551C1
+ D67599D58142AE7B3D7CFD7BC1BB764D33BC547CFABC288A0480AF003C95DD30
+ 9B80D65FFE945845AAC546D7048316484BA0F1654F32C8CCD32D39DB6C8FE440
+ DE4E761CFCC7CE9981548B5245653116FA730A2491EDA1A73E26C6BB2096ECF5
+ EFCA66838BB21ECE5383EDC1DB65F73E7B6F96F335E3BC481E4F3DC215FD7DAC
+ DE913B06AC06977D612E89FA620DDD7FE5B43304AE242041E41105BF821DE026
+ 9AB475839019BDB330CC66BB745014DF2861322529FBF5429FCAE36F98BC5E34
+ FEDD95371FC74DDDA1DAD47D5AF5BE042D46A3E303E3FD20A21E9CB54D5005D8
+ 6460F07C6E0B8DA33A52960A15E8D06AE1098AFF4A818890215E043F1AB2F663
+ 1B4739F858DB267934E883A70D8CDB6940F97DAE92D4FA05666F3BCD8A474707
+ 6A0D2356E151D84CC2868A9710AF061CF452D4B85F8110D76172510E3156B7F8
+ 9AFCE6B304C7B3FF042068ECD442CA3C29EE13B1A5F25AA46F8FE777E910CA9D
+ 6A559467E9B92C824AFE83690B5334EA8805C8BB28654019AAC0133A92A87018
+ 1B7F13C7EF20DBBAB426498D4A1ECDF9F222C2DC3F204B27BCCAED3A64634B83
+ B1FFA639460D86F1932624A45050E5940029ED3C6D436B6659360421742E325B
+ 8687F15C5488DF19C52BF38BD5850B4D08EAD81EB6F7B44D7316CB2986E2B86A
+ 1EEA81C848088CC76AD8891D31CC20D93DE8BD3840F209EF4811A203875992DA
+ E72437CC14579369DCD471D0A1959D2E23607E1F4F8A91F4EDFE09111B777BAA
+ F5E1EA0B58FDB041199226CF6A18C2C71230C06B0418FE1C8AE044F5592988B0
+ 3B3A366751F326DC103755AFED9B2434E5DD0F5F6E92C758F0325BC3B06EF602
+ 3D837CB592553F1F3CA12720093FE3F0AB964016458760A5D35AD01E33957C1E
+ 01FD2E0FFC0AE147C30B9D5EF09A04984BB9380B44C518F10EEA97A4AEAD0367
+ 380BE0AEE062F46C4BA1500F7081526003195F261E6505397512041A58CC2A46
+ 4DFAB3745987176ED243988D40683BF9ED820DB4A7E5BF8EC766B815AB25CF63
+ F4ABA1A08A21AFDD9764276032BB97CF1B4677D54A42231DCE4BAA7EA6AF8AFB
+ 13C3640F756BB81F8C02E48BA086DD0E6E466F15C026F46B896C4C3EEE7A00A7
+ FE7EAEA5269A0E19016036CAC31DAC13A48CD7F96BB74F784DD94827C55874F6
+ 8BF87B647C7724C00B89149450ED0FB652C410C2039E78FD43B7ACD3B7C37DBA
+ 9F40468DE520F45973084D9DC7014F0445749E4ACF8C40300D5DC1733ED713CB
+ 78DB24D82E3DCAA46611330847219C2ADD285D3A67EF99CD1BD0A293BC0D75C7
+ E66093528B068E97E7783A69F5BCA8121D37C11F9B72B4C2F6C4FF0F08481F25
+ 9D50A1120F8F3ACF2B0FF72758E308CE2DA8FF47EB2C4127712AB7C8908B41B7
+ F929D05375AB990C2CD5395764E7D4A5548BBAEB811F4F824D7764623C2F29B7
+ F80A05802CB90F4FFCD094F121813A489236B17A48001E9EA9C14EC005A7C85C
+ BDABD10A543ECBBBEC1294F6B8E5075261E48EA14E5868825D34CC256AD864B6
+ C80FA54A7BC3BC3ABF1F8600599AC9A35B1C598754EA5E42CAA034B2E58FCCF9
+ 266A54BC856687FECE4E0AAC4A3C6B6778BD04987A0D9F507C2562BCCF110AB5
+ 72BB9A4BF0000D00F4700EAE3BEF8BE33DC1B5848A44D3A791F42B218F2A6710
+ 1A885F07691245FDA8475DC7EEFD323796BBD4A349C29B318E9BDEA5D8E04B40
+ DE1605C6441D46E4720909E0F5EB6401025417C7400E9DB8E9969FE235EC0395
+ 98390B2EBB72CFDC021C34467FA8CDACE644F0A8A796B9F12357494890171578
+ 8968E951D39DFA9541C22A6FA86F2B77AFF2FAAB15ACE791770E9966CA7F5AAC
+ B9E6EC7584987A077D5F78A6767EF98FC5EFD584C5938CA5FE2E267A82B2D964
+ 07E946783736747296D24D95B2415BBF6C22D0099B6F3AB0A87AD78857A65CA9
+ 17475BD6E0A9DA63777CFBBAC384E16A1B8B7935C25C0555656D508C629E0347
+ 0143CECBD1FF8D8CC35308CB363C46A76FAA0CF08668543482DFC3A4BC1939BA
+ 6E9C94ED55BBBBDFDDB55CA3A7E8B4582B1F34017F5A7F13A48803852D1CDCF1
+ BFDCB3DD604E2468D57C0E44BFF7F62995277EA49ABAADBF6C28C571AFE33402
+ 8BE87361C5EE40C871B4FBD811ECBD46D63275C8608A3CE46A84FC9B2B2B5851
+ 04E7E98C37DD88EA93CA4C092FEEA716FE97E147F86F0C30640968B5CC915AFF
+ 155FACA6437A5A35BB8963F15DDC6323E009236ACFC6A5D4DCE87380EBA3E766
+ 343936B4E8FECC60EF6461AFAD189EB418AA6129429D9F6BFB87487110374C66
+ 1883F136F5216CEE6C61ED9865AB29BF510E1E498F9ECB96A42E2F6C3C92348F
+ E76AC1FD082ADCE93FF4438973E570E76E93007677654514EFB4231173002805
+ E6421B56BA1C558116F6743FFCE591BC29E10FD449D15F7BD80F1E893A7C4187
+ 8BC1FE630B80D213B5E543E3DB537423FB5D00DDE3D56752D648735B2008F77A
+ A18F0055A9693FF1C26F9246AD3E32BB86BBF87D6F0FA5C19A06551358B62764
+ B8F9824934159D0FE95258FE68808AFAC1E1C78127ABA43E33C23FEADDE2161F
+ A263800648F4C2C962F58C033E42F941B7EAB4E6C14A03FD396C350BFF868403
+ A59CD705B4765D19C68454C3D643D98A5762407378438DC9DACE675D9B30516F
+ 1D9F9053D07371A3A7EDD0334B9C350941BF5CC6EC08C376551FDBAE63DA1CAE
+ 07933BFC7AB683529BA922F285B7D18B660E49DF07B644B94BEA635328AAB044
+ A71376FB681F108A441B906A023D7327A80BEB18F92495C9C1ECC1483F7D84AA
+ C296A5B3A0A28432CD530545FA36B9DA45CDD95DFAB0D819B9B7039C3B281BDB
+ BAC92D56A3589A390A9A6752D9912F163219FB4251F51ED37F0600F4F1785C99
+ 0F02360A38E96C1A9D4DE38B48E356FB52A9C14538259B0A4913ACA0326110D7
+ C9FD212F1C1B9C2F0E45A7679CB250682473D61FA86598DB7B972B6614E4C199
+ D11D5F10D7761D5B53EC577318C2DCB15060D51DA20232108FB2DD0DB10B404A
+ 43300EDDB3BAFBD9D2EBA28FAC872B97B10234EA2EB97CD74FA77586B721CB02
+ E9D104C08867B2FE0B9607E4BA38564463C19807C8DD6AAC8B4AD7C47FE68966
+ 2C85F77AA2F27D27814D7401D71899DABCA4A343EDB8307841D46C9A1054BF6C
+ 8503EBC00848C856907CC506FE889A978340744A5004BF0045917F2AAB092945
+ DB3B2FFA71BA250C2C40E0C84FDEC83FDEC833732C91CA1E6482E955A4EADD62
+ 9E6E2FE03F9FDFCE0D012983DD52F2CF59D04766421FA71C1CF7EFB6C9CDD354
+ 2D622B239C48CEE16C8AD3BFE2F8CF92F1449F321B150F4A0CFF712303A9CBE1
+ BC27519CDB84A8C58CB5FF2C4AB020C03B19033933F9B901769F977E5B8E6566
+ A68308A5FB0EC1D31ABD80846A8D10D80D2E32F682AD109EF0B9950EA889F421
+ 9A93231EA0825D78A51F80DF957C8308E6CCD24DF4F1E29B8D3CB61AF8359C26
+ 95EACE6493C1FE525B22D9479366EF3E9A8733D5B0E6D9B6C9E84DA684972988
+ DDFE8EF0B41825FF165A993ACB02276A921B0AB92772C38BE99429B3B55DEAA4
+ 7C77FA482EC1BBC02AC2FE595C6D79CDDC24394D137D61159AA02A044551B069
+ B01AE2BA0661E8697BB337801D7D898ABC41925E55187DB8A3B6137BBA1250AF
+ 68889E739B1424EEFD68F93E6D3D78C72CF987161B21E6E2C9013D56B30FC9B6
+ 1B64AA5B28DAB85D339399F9AEEBFDB315C94E8F53CB41ED5805705C2B1F4B49
+ 402BCCB0FC158038CD5AAFAA2132F74D48E98DA2CD91ED5DC1B21442DC24F823
+ C37DF2C02135C01117D2DA7B802ACB949A26659764D7E12371DF8309A7100EF4
+ FA22E607EDA69C5DE2EC15771EC4359EF5193532064D20311DDCD72493958001
+ AD6F3AC5983E7DCB56432F46EDDED81306D357E87A801F80062B13A2436D70AE
+ 190C1F0E9A91AD5380946F5C630FBD438B1B5812F126BEA3D27FEBAF0666E97C
+ CA3E6CE7955FF46A9E1B775B47692E375F99C121845704EB0374B6844A094890
+ 62E55B4345DF3ED13F00C9FFA9B723AFDDC729560EEFF1CA8D17273CD3FB7992
+ 9B67312D3AC12BD79ADD4E06C18F8A4008C81683248D7221FA94F0F1C57FB6F0
+ 5E91EA3120D0EBEE097C41C493042C380097EBF751725D27CE9E78D05BB72D52
+ 3938A3F84801B4DA455AE219EE99E007E8636E2619CDD1F3F5AE58CB0BC9E3D8
+ C07691E72739550F42DFAF826D1E6B956F02B5B7F178637CD80F8AE714AE04F4
+ 9561E92A9E4B385A7237BCB804EC0C4535F2A407D8E071C2BEEB1D5CD414423D
+ 7001EB575147374F577E37230A74F1D5532D52D8567B1B707785D59DEB104289
+ A1E2AF4244CF3F1AFC0078F60BC6F9585C05092AC64BB557664CBE8A9BA34D45
+ FDBEC9D250E1F3BECE691A4785B9FB0B8F231494709752A466433D671A529DB5
+ A444C4A4ECCC5753537B77803FBF49FAE61B667C85B2FD69ABEB9CD8FB517FAE
+ A82A2BE837016BA50C575887EC68AA2603D0B482E3413878AF2300CA393CA635
+ 9B38A0115416400BE0D74276B8F37587B6AD88355180A891A1B5BEC45908B7CE
+ 80046C96A0322396DFAC559021C6135C4B5F19F8D0FFF0A0A05BF5A31810370A
+ 7A27502BABB381B39775D44010AA4BAC610EDB7F6EF37F2A6EE206A04F4B58CD
+ 14133217B5FC72E1A51CC76EDDB1E53AA11BE2BFDCB43F5B9F0B846B9C20B006
+ 9A5FABAEB15E2A455D6678D0EF527609C9FDEDCEE943DCAB1D8CACDF998A5F04
+ 7C195116A6AF06A594F5EA2C0D344D55397ED52CA594184A047CF35BADCF2041
+ 676E70012AD1F142BD9A514403EC554645B7DCE79DA164A484BFBAA04DE6E0D9
+ C68E495F9B4E5800BC441A82535A35259D083DFBFAC285BA487783664112BC10
+ 973B6B4D37554DB788141DB2D3AA325CE6FB667A4872A5948F971834C0C61AF1
+ B8BBDEC9971C0EECB5733261AF2DE070CD20F9DCDB4D851232AC7EA60996BCF1
+ 7972CA67B4577E815E1E97C586B019D29D3E4BB48ED7B7E6AC9827CA0CDBA01C
+ 55AC6CAD01431B606F53CC7AE7979ECD20C1074BDE91F473AB5EDDA6F0D64557
+ 87CDBB73F869BB0E544318FFAC9C4D0F1E6A83048625FA8B02A486AB42A9B83D
+ F23544F75DA3681F4EC77C57618B557BCD991EE79ADD557A837F05BA8435C1DA
+ 6F31B253FA80BFA2135C64630AABB0384F2D684774EFE1EF31473367AC6602C4
+ F597FD0059814378EE5D118E1332B496773D2EF16781D921FBBE597D7C507075
+ 6B61B142D5C7FD6E101CA062EE63C61554862233952709D0889B8EF23EBE89FD
+ ED5A8752E86804674BE5957F905AB913EFA354060EE949ECE9F3365DDBB65EEB
+ EAB70E97A9AE28CC4F19AB9C76DD0A8EE44912D49CD543C868544AAD5F8D121F
+ BE7EB0D54B8DD130D94A14F24DAD841B6075F8A87DABDF8AD334B10586AB83F0
+ 5822B862E7714DAC1A6D939A456DFFC2BB5FCB54EC37E542DB5A6850E9BE89D2
+ 152162EE773411C21CF2B496B426CB5AEE76ABB12C2966A5C30629D5DEEDA6DC
+ 586378481551ABF497669B061AD1519C4416F61D9DD985FF50ADB8C9C0DF8221
+ 47A24380D8B48CBCE377AF3C188A3F99123CD019B8B4FF3C6BC7368CD16E6E14
+ 3F15CEC50F7A56F49F7BF46E8988926736AA4C0E53B7B1495DBAA493C7AAB729
+ 03EC033C9FFDF8CACB4B7338312B67546F2AE8F79A6C80BD728ADAF2D1297C32
+ 77C44CFF158E22B1163D44601B50E7D644926C3C34E91FCBD2457033AAA23817
+ D61394D397FE7663054727483DF12A34092CB606BF0AA77399F10FF5DD317BB3
+ 471B09A8F2AEBDC803F169F5C9F154BD7F464129F0B5FB00F2E33318E769EC58
+ A9CC02CC57BC43C2D33A7B92A38F27AC16CFAED5A288F769B5D2B6E8A611F1D7
+ 0079A1058423973B2F787BEB55F044F494AB16342DB0AE76C68B5151360D6177
+ 038EC62E11E28CB2CAF776A0217F1DAAED2AD630E38E6F8CD04E5DD421FF55C8
+ 58000457AAD6D576DD977D334BB82A41AD1BB01122C8ED167913AE56D59E641B
+ 30A04B6558BBEE054450D569CFA392BE137A652AA4E1EA586A9CBF7BE6509A8F
+ 6BE29C7EC604D2218AF03D376823192322E8926B672DFEE893307E5786D0B060
+ 216078ABA55D8A88E0959C843508731ECA219C4FE6CB9B39E5B07DA08F4BDCF0
+ 1A4BD0174AA06F1838803F63041C8EA9C452D4E401A93F66AE706067DB9DC2ED
+ 82E9890721C1502A44CB77AA16B5ED702F7CEB116949BA14839CDFCD67615281
+ DAA1B9BB259A3F454D7BB7BA6561A19DF0EE462C0815122B3CEB6B06FEE421CF
+ F9F843A72A0D9F053EC4B4F6BBEC61B627649D2BE4FD83218D686B3F234348B4
+ 8D4C6739728698C676F0109E0C043AED95429B980859E5783E012B46711820EA
+ 6303555A73C0DE45C1F0B435CB12E69360274C1A8EEB3193BE46D5F17FCD785A
+ 9A2AF6121ED80DDEBFCF006E0DC3CA578886766DBF1AC22B8FC02ADD76172DCB
+ 2E2B4D3DA6F5CD3C2C012E276D2DEC311996479CA1A0F29A39111CF7B0E40A58
+ F7F276C23FC59CC61599C85CE932429ED99DF5C01D4A79CC05D6247FF93A316C
+ 9086B58AC6B1420EC7A10C059077D2B30CA63129B0DE762A85EBDDCB3226018F
+ 678F58188332542ADE690905D49170FAA6F3F6EC9B170103BC3E9679D5909289
+ 1F528C8BE533C6C1F7618F640FB5F036FA111E40ED2893AA4CFB22DA15E8681A
+ AD914F354A7908D8C5CD9D11BB8C2396CCDE11E5D415505CD80DCE13976A6C5F
+ A5192C259D87087FE076136E7FD8185D6D77265961303E5F3B3E324ED9F8DFF2
+ 39BA31EFB5995A506B04EE545A88CD1E2DE9D1B65F64AE22F8C5C0B68A08E277
+ EEE0F16F6875B276D80D27A4A877A1316C6E07926276D9750C482F9AB4E41226
+ 7631802D402C367879CCF7290D3C0CE02A074C1E2074FC1DF130FC2BCB4BA3D9
+ C6FF084396E4293A6A455F0EE919DD74C14271FE4B5D8CE6CBF83CC6F0872C46
+ F5288387D11E76B3CADBB21D9BA8046FA46328741879182142B992CCBFC7D715
+ 432E88BD2935EEAAB134A75D771CA0F8988EDC0F821549F753529E0FD6FC84E1
+ 95C51A4EE57FD2F33F2649247F6FFEE62EEE8611C5FFF8DBA2F19F44B5675B55
+ CDF1EB710E5960134932124EC9A74C17B9F78006F34EEDDF4B2CAA56C59C9706
+ 13324F55578E791870D777B62B6BCB203D415CE679FDFF81047159CC09E29B61
+ 71F4792E986D97542E35BCBE1A4E8AF04286BB685DFCB4302B75213F8C945149
+ C386AED7E150A62CB97B5B5E2B234793CA68C8796C4E83F55FA300FF11427942
+ E8C7A5DB5D1BE44F58E746E38F95CC783EBAF9E06C638C619E16551D33E77F51
+ 1E582CBA4F34DEE196EC8ACB3249B4525CC0C94A840AB339925EAFD705ECDC03
+ E2F11D8309527BB8CF44E40521EE0E80079ABFDA124C988445095EF9A479DAAB
+ BDC3DB3DF506DF12355B47A644B5EA21CBD0F66AB79AB6CDB87F1F7D142B8CE6
+ 8FCBA9D56E933651A21F464A10AAA3D33040E14BA44E35902451543A2DE0E4CF
+ 2F94E14B66C29FF395003A800208975C8B12D9CD408B6BE39F94A1B6FD739A51
+ BAAB5F01A001FB24B09E21CAE1CD342AF32C15AC474E84DAF571B8C5B3BA277A
+ 7A59AE7E798B36C42CDE0435F57FC6BF9FE327D7AEDE3C8F78F5DB14EE20D8A8
+ 1425FA9F1D417D88E915B326704C6F2640E9538D4645746D386E702AB479503B
+ C26615110F4851FCF0C56314A82D97DBB1ECF8F6DAF4FAB693449B0649819FD7
+ 2749DE0D08CBB3B75BCFD258064CBAB5F48B2F6404C36EBF8F6BD90CAE8D75C1
+ FEB3F259B50F3D52DCF33867155668872DE3E09FA4D2559C85474CAA8A4AB5CF
+ BB3DFD0DFE36677E0C7A496CEE2440DD3346C480C3818D0FFDA6B8A227A2CD30
+ 48B82C2D2BABCCBF115A229812074F1811CDEC7D68FDA32C454AC2800F38F861
+ 5A76E3B1DD4D05AA8DE64C7F276FCF0D990DE2AF4D66A40AD6BD0BE8B69891B7
+ 7B8497438389D3CEAC1EF4476778CB9D18087538AA03D59DE78BE7E7D7FCA204
+ DEDCF75FAB49ECEDF2B7F8F67B18F73D7E219AF9DF3B4DEF0BD3D455369E2BAA
+ 02F262671BBE5BC9B6A193AB26EE51043F61D73FE0C972DE9112F009820BE067
+ ECF446E96A229FF474D73AE198F3E53C015EF361697500F3480C56E8C371CA36
+ 00CE20B15FA4E540ECDA47018B817628E5586CD8A25FC74AE80498B5A4D20EDA
+ C38C78B2C62BB872C0C0A04FCDDD493F3CC5C4D6769544ACBA0CCE16E78B8E0A
+ 2C2024EED4A98148BDEE797A5120E7BEEFB5CF2C36F92CB124B3D164DD0C0603
+ E0FE7260B46F8706AD23786FF3D52B02071C93B484C0BAD42F9CCD70AF92A36A
+ CF589F82303C1AAD6D45E08C2EF9117537BE3CCAC6EEEF623352D931B833337E
+ 8E66F9239B24B51625E89C5BF0266B8C56C22A9452751EF3817C989557D21B1D
+ 35FC34E208EED1113165DED480A3149C7E905EF56B6861EF1864779818BCCB64
+ E1376758C15F202B67EC2CFA0410136711C9D7B0DBEB352A2BE5F7EFECBC25C5
+ D2089DDB215B49DD73CEBD616959EFBA201F0FFE319CA8EA4631DEF2C774F133
+ E8EA2D8C5A92145D382AE633F3BC4DC480141D273F2992172EE3787C625791CA
+ DAC6380266589A79CBC1663220DAC3D3C2B2F7F56CDF5894DE243832D7DAF228
+ 0AB6F1A11A867DCEB98AA191A07B18331374DAD9CFC44A8C257BD61ADDCCCAFE
+ 75AB380D00793F2F45476762A3000F7E7E2C4F2590E23CC791178A9C1DB0B1DD
+ DD9E60B7A1E5C7D4FD68707E8F508A69D3DB19BFCE1C05CA88C601EDC62AACD7
+ FD32E75669F6A83338F852E85F2CD6C7E8D42D3F1BD4CE1E706599E0035C7A65
+ 61A5D2E3248A4670099A9FB399D3F595F96F1AEC78D2EAD95502F920C74B5DD4
+ 64EB4645B4D269EFE40201064F461BF018C3A322E26172B66D8D4670C77BA741
+ 56F5C6EF7A28DE74F7F1C3A9F4EAA43A105CD9395A33110C1142CB6ACF5DE8D9
+ DD8203D0ADEA0F839CE51261AC326E3404149D4B5AB9DAB81B186A866F40E19B
+ 61B2B8C8EF88557638F09653A91854152E5D79D3BF42CF421A4950674D60DFDF
+ 073042D4D7B5B8A334659FFFC107199415C4A967B51145F8AA8A75DD003FFF01
+ 17E175C69D6E15DBD1A91291134DADC1E359C4783DB70C510E223993C5128B5D
+ AF5EB90D01D383ECEC8ECC58B36BC770054FFC6227C1205B8749121E6D523524
+ 7E599D4BC77B64064F8CDDDFAF7A4E7FD542AFBDE2476B758D465DC0E33071D9
+ 879CF8E886A4A7C7F5155DCBD4094A2A3C77072CEE2F9AAD3C134B16C08AFFDF
+ E3BDC6423956ACDD00BB9A5E2A368F1D38515462DBFC6E1AFB66E8B14701738D
+ BE402B53EE158082940951A430B5C2B66CA56B59793F28BBB778E1F8125E7ECC
+ CB22A580E2D4CABF884388DDBF136901272952AFF3822CA43312F097922E1DE3
+ B678789F880E3B72ADAB92C724EC3E3C35E893B8DB006D53CBB0FFC0D6DE1A9E
+ 8E88BA93B087CF382CE52BDF0BC80EBA704481E5C00E38007689D658210674B6
+ F8B3937958C9C0F2309095F7C618D532C5E4A6CEAE3F12C9308C63516F15C656
+ 6413EA12ADEDBBF9632F5517C58628DBCF2A07D600CCEC42A194B276866C8A62
+ 84284829D5F9E8B3FBC3CC2034D21F7DA3E989F366717BB1306B288F0D1A2B55
+ 29F915976E635433F8FA8A6FFED3A155AD592DA9B0E3169992D6A8D2227A4713
+ EAB2A34366ABA2381EB8EB55A0EE52D17AE9C15612ECA3F522CD2DA66D970DC6
+ 9ECCB4507395306894F6388BBE4B435A2969D4DB3EE56E38C0A820CDCA9C7258
+ 1F692709C2BE0CAE40B9D647B7BBA8D76BA3AFF94870798BBA7F47CB4993CEC2
+ 6D89A55A1084DC14CBD7CABE9B562B31050857FA1D1FDDD5E97BA8ED51A883BF
+ 2B50F5456DDA8C6C6A3343C87F2FB09127220AF5F2DF635BEA0EAE94203B97D3
+ 6A7A846795785C61A76927EB055110105616991AF777B421C7A6105522326134
+ 64C7671E8959A741E0F9821A4C99BB3EB3DE4A981A4F8237AF699CE353A03063
+ 20D37A7B23E8B21759AB8C32F09C1AFCF3C339EAA3D1899CB667CA91883F2AFC
+ 60E7BDEF542B7211EE9041F99B7628E87D8980
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMR10
+ %!PS-AdobeFont-1.1: CMR10 1.00B
+ %%CreationDate: 1992 Feb 19 19:54:52
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.00B) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMR10) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMR10 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 12 /fi put
+ dup 44 /comma put
+ dup 45 /hyphen put
+ dup 46 /period put
+ dup 65 /A put
+ dup 67 /C put
+ dup 76 /L put
+ dup 84 /T put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 118 /v put
+ dup 119 /w put
+ dup 121 /y put
+ readonly def
+ /FontBBox{-251 -250 1009 969}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4
+ 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F
+ D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0
+ 92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C
+ 295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75
+ 409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C
+ 4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF
+ 2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E
+ 0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E
+ B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008
+ 24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B
+ 43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF
+ D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575
+ 5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC
+ 96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3
+ 7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65
+ 0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830
+ B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D
+ AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007
+ 97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8
+ FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5
+ 20759B6A4C4466E2D80EF7C7866BAD06E2A1040FAF2DE1FD6AFD5FD97EAAB614
+ 956897A7BC784E9865B00EE8B49B918E886049F1F4939403EADAB83A4D8C332E
+ 2221AF8F6F4A4954501CB6A6268AC96F7091245F034BD65542DF47BC7BBAD667
+ 1EE6AF9187E298CB7AABA58E3FB5B4C7E86616C1A830A4A937C265CC28A83EED
+ 8F3C971D6DF5A50A615B713F5332E0CF05C754FD76916FECE4DB2807334C34E1
+ E2418FFF1B4429A564AB857F1E23337C75E729645AED52B51C319F277F0FD789
+ C8D5F56EE75D274F2162F53AA09B150479161D8B2F5FDCEA0020FDC7A51E4AB0
+ 041A3247EB7E667B2842D65A5E184D7383D4B7034808F6E4E32CEF72DFAD9C60
+ 730CDB6C87A6D571108A5969895654C00A5F30A5F801DB459733371B4B292AD4
+ 367DDC8671EC48E447C84A11C0CD332175E5278EA0678603F85C0F3013AEB1B2
+ AADDB2337DB914580A9547B6CDB7F4CCD34EAF4555F34F8023B15D44707987E8
+ E672F486552480FFE3D56EF1EC01FC6D89CDDD2FD96D9E404038CB57A8018789
+ 80B52AFEE8453D49DBB6803FD753A9E426992ED6BC8BEFEEAD4C4AF3438178B0
+ 28CA1BC3EEFB3E577C48B5548AF39280B578C57F15D490AD2A1F44086CC607A3
+ C6D949B40B3A0B8C69D1FE3312433EB870B0224ADEB890A1F91618595AB6D1F8
+ 3CE05BFCE07CD6D6217E179578AAA193C571717B4FA7C39135FA6AF8A37E66A2
+ 23AD7465B8FE68AC6A224CD1B57589498FDC2377DF9A80563021AC68FA849DB2
+ C5CB25D2651BC6E69F910C1D7EEC7D07BA988D1F42E5DB285D218CE09359E378
+ 1298FB5E27FFB9A1BEE3797F9864877AEE1DFE25B380D2DFC3330A4ABBB38166
+ 5AB77EA188861BE3D5CF2E122D404E43E4E25E8938E4BAF2BF8E26A9102AD330
+ 1E68CCFADBC48C07DF7899C4AFC426774F1A0BAD6AFDF2E9F54D2F40874801B4
+ 4BB8811A921F540589EA7ABF3A210C4F42D3F97C6EE56522D30CF69D79DA9E03
+ B02F842F1C33C5AD9CD2FEC1D39CBB99D46FC06CCBF858A7F49F5081F1FE0DC6
+ 176584227E9165DA6B799DD6A3FC970C6FF1A28D3EA96ACC8994A395EA7F1A0F
+ BA8E217CDBFAD61CC2A8C80A9ED14A027B59CB9A0F4115D7DABAD25BA46B4A78
+ 6F7366B3F761DE28689BD1B5D3C5F6E15F37C80E22544DB907BB47E6B700F7BA
+ B45AAB772AD411097FAFBA60B4D58E706E4FF1BF4950ACC82C9F823E55277F27
+ 9CC71C8C4BF533A0890789109D42C5F7386DC72DF4A4C75B722142050FBD77FC
+ 29CC7333B96B5F4727160E8EC16CD5F3329678A6FBB32F32A5F475F9A9FE2CF9
+ E66734A16FDB148BC3CAF746006CD8754EA7DE2800ECCDED9D7AB50E603A6D34
+ 8312CF2381A83701459703EDC1997945B71BAAF6F7CB7B9F375FC6986592922D
+ 95E19ACD91A868E588503E8F2E1089A52FCFE2D6B31C71D543AFAA541A98E666
+ 2E477B00A4A14AC54F71EA2AC32310E0C262BAD2ADAD0679BC48AB1E20C16AFC
+ BD7DD5A0A0F4D5B3A0FC5D725990B7A81B9401066D1153018A625409760F278B
+ B4577C5930CB6AF43923F6BB7883EED264DD5DD39165BA81DD7DC2956E31E39A
+ FE0645143A805C6E8CB768D28E20A31D10280289CF1DCE711E4E3F3D9B386D20
+ C12145D42C7CD0E993DE8C2160DACCBAFBE5BF2EE5D9D9502BE60F9B1F51530C
+ 1A82FF429FB58DB740F2216747664D5FEC2EBE7225B9B07E5208D2A4E79E68CD
+ B8DAB60CD03C9C15A6C4C0BE4FAA01BDC06AC69C82503B14C2D5A0F4E04D9F28
+ 75ACDE0302C25159847CB9F8ADFC0BDB56A06AC6943F8AFEB07673BA05689F45
+ 968F8C1554BFCD88AA852522BE6A2A171CD69CC15E89304A97B6E2875890DAF0
+ F2178F0F8C7CE776C59FE5B9E8A8E2E64089F346B2BEDE69F0C0A7E15FC4F4CB
+ 17B4FA9947BF627EDE250A4F6B9D8EC7818092708FA80555A88EB0FD1AFD89BD
+ A675F08BDD3F8F006D490C3F5CABB1442F7B527DEBC199E52C94E501021A9563
+ 8CD1113DC1465ED58ED3C66A78D419E1772C5AED50498429A57094A74492D089
+ D897F03C64BFA269642A348FDB3C0160F065CE9493FE979C1B27AB5014B96234
+ 822C84B723561F243537BA4CF06420053F7C855B61BEA0F6F6230991BEF54D78
+ A7DF8363A3F62E9D49C209A43AAA2AFF2E73F2C32E0A097B335DCDA71D2F9F85
+ 29203FA8B81AB927A9349F63A6C45E0B73D743CA86DF515962F21EC208F954AE
+ CAC23982C247C10314D07C7D7235DA5F9570BF640233E9B2BCB534EC6CEDAA6A
+ 5E0B636194F6C7733CC72CDEBA558476410AA6BCC4015F6F76A6D9D012432ABD
+ B922EA46170A17A575ED9EDD178B9B3A6D5C95B415DCFB27965E7941C2A34FD8
+ CB181D426B4268D715706861879A3B09111AC8A6193A1BF305FFC1901D36D001
+ 7020942DE8162AF81EAF5CC16EF86B9EBCD9CDEF39A8A802A93E22170B8D9E01
+ ADBB97A6F0F0D9043E6577424FCB4F36DD0D6F1371C2D8D902ABF52BDBA0F800
+ 058B077351402B2C80FCD1D997F21A3BB6F90CA1B0F658EC34165D628FA5A2A5
+ 38E590DF8AAB1860B46831377501A06AE1F2AD48F09A5303918F05A9FB387153
+ 7FB55D56AE4B14D930675741B072679D6E4DEF8193C75111312F602E3C8687E4
+ F639D8076F6D22B23D97A7E6E231B9B6921BDA3FAE4C4A510C1F95C9C303307E
+ 6DD5D2485BE8E85D23B6AF0C0E948A9A3803A7D2F385F5C6E9D73F6DFA46F21F
+ 5E1A9357F46C39F17CBA6325D9B4E614693A2D6AEE3B21AC6FFD85FE51124FB8
+ B0A13A95B18DD49497D899F46CD0CB4AE8094E78EEB3C932B3B81488F5BC2983
+ 8DC1A4E6B4D1FDB26018AA4682EA4A6F330DF7720C9C81EB96EE7FFA4BA5B990
+ BFE8DB107BDA2D2614405AC6B86E801176FECAF2F10E56119A4FAF11AF7BC210
+ 4EED3E898B6B272005772590090CC129385C59B2C43F12BD09C47C4F0FFFF7C0
+ 53F64F131E8009BBEE67BE3DC2A6161D255A80F0A4FF8E00A43E6FD654F1FCBA
+ 3059932243BE4EE0199B397569EC419C127B16BE6A48FF5037FE83F5934AD0C6
+ 5E3CCE6C5AAE64DC3889929573C2EF99E08C04011E95E3D6CF214335D8A4E70B
+ B1E63C4B2B928597675F41419CE2C94BD8D7BA3A7E3FAE3710308F6583A1AD32
+ 49FA3269D105421D3AA7C55AC5B2F85A218F620C537EFE334CBE0BF7C6C73A19
+ 9E6C2EBD77303FD504BDBCC48E9D781C04CB602A0E8ADD0510C9B86856E55FF4
+ BAF5355EFF583168A24BCAB83E5A0D64D5A190BCB15D41C3BE17B699E044E834
+ 99D3759ABCC7A892E168BCBA4B3FAB3C9A5FD73BC232D856390E32B9F1752575
+ C74DCA2C2897F12F0F4656A84F0432C804FA67A432FD928D8A58376B3811E194
+ 4121561D82AB8D8E972A4FFC864B5D1F8B898B1DBDA081E98056F19CA3D6E2D8
+ 225C975887D736D7FFBCD65CDA789AC1FBFD8B22B2E6950DAF8BE38C8E55DBD5
+ EE9A67B3464AB53F305ADDE4AB8F6704659AA70CEC6B3B88DAC393C4D978232F
+ 9E013CFCE1ADF4A1330256B6EA6EAA01DD23318F706323DB25F426B95D77216D
+ 74CF17E039F2A692EFAB8A0917D4B13F9F668FA7C4BD6149A5163FB4296994F8
+ D491122436D5D57F067DD6EEA6B5535EDCBC4273CB0AFB0DA38C9D9F2AF1CEF3
+ CBCB2DCE6A12E646F76FDE18F6387CA59422DF7DEFE0F9280562AF06989BCBF4
+ 10B69988DB4F5DB5BE9B971952FA42B3078CA48AF2D5AFE9CAB55A97911FFFA8
+ 9A4FD1919A6CE6FF1141D86DAAF4DFBBC627B33FE2DFCC8541E31A38C4609CFA
+ EACF1272B625DD08D7599FADC7083307C56C407E85EF843F9EDBD62323919464
+ F648F96D855834984BAF25326D59BEED50C27BB6D04FD9E6ACE107EDF3F09152
+ 6947E15CF71789EDCF7B03AA905B84BCD5892E18AFDEBBCE3E75699B138D7847
+ 1E95BA6130960B10A4B5CBCCDFAB71843D12D5B909254959A23A42789F27FCE0
+ 1894D6D44D16631A0F317C146D1C4D337B7735408DB42A6E35E65FB035E2971B
+ 3ED4804BA7CCFEB4167BB468F16EB3772295CA8EF9D1681D7950CE55FFE8E1F2
+ 0C6EF4838D119497D25D3A54640C99D5451F2DB31ACF34FE5A5E2AFF75199671
+ 8BC45D932D8A747B50425706FC6C76D00FAA1149607343157B511E2F463B83B3
+ 25638C26C169A991F31462A274C263D7E608F21308737759F2271DD1BFCCCA9A
+ 34FA4E40A75B08D239E5AA13E3C67F57DC22351300AB1E6F5BA15D3C89752AFA
+ AB4A89E335D39752122477C4FB56988E8F792F2D8A3622DDCC01F592D1142CE8
+ 2021CCA09465F0F41299CF3B8D258A0E1488953B18B3DF731A2D06B0165B6843
+ 71C6C8B65908CE53B4106298652EE0D378B620FCABE70BC5E048C6118656EDB3
+ 260C6455850FC332DD1301E8455B42828FFEB9F1FECAADAEB0E1020338A8DA30
+ 8604FE055AF8EB6F923BFFDDEF5A2ADFDC26FC3876F6A96AA623B54EF7CA74A2
+ EBE338D0157242A02DE8C4F853969F824EDEE32D7A7FFAB23CD89567CDE1E484
+ B6F93AFDD1D46E44DD09851E6E7737F2B4AEBC000D7B33510FED6EDE1D324DBC
+ EE614150B77BE0956D6F3999946F7CE64505E4462146B85BB530E7BBAD82F1E2
+ C8B0427C2BDB62640E2FA47B26E880390EDDE834B614F92C0153CFAE2EC1D21F
+ 5CFAFA0F4F725F2DFCAAD5BD2A73727E977E54E3690C654BDABCBCC8DE116429
+ 4B4B477AAA08E4D5845101B0F7D0BEA7B465B6062EE8A8ADDB93B62480887431
+ B546BF3AB12389E543CAFF47695FF1BE241F832E45FFD2349E8D39B75F7EF95E
+ AFF7F3694325EA57F8938241856002704ED09DC3B0E983E72F514BD96DE5A09E
+ 1316ACE95A495AC3C893128B8D01707940C1560C23F7C3599AD859C6058D59DB
+ D17CAB26D9EEE8824CB90DA6456382CF48CEB3C7939E69BA1F121F76E8E47522
+ 391F936D1A9569D1F4097B1546BC1CAD7CB1D6E60F7D78662CBBFAEAAEFC285A
+ 4CD9262E659DA0AF53D476B80F802EB99CE982C85A0FBC5CF4B216D9BC542D0F
+ 25C25841CA586989B3016CD088677F115C6029247D95EC74ECA05F2E27F321EB
+ D65756A381DC8B0442F957EC4C801F3455B63E819D337538D1E51EBD9F2EBEBE
+ A3796729B6595F8F29EE446D054A6220805E2DA79C45C2956E5E873309D6A77C
+ 355152731F5BD4F433DF82F932B4EA30C6FC0BBCE7DF13688A52C766F6C6470E
+ E97350C11419F16EEA07EBBAB6F310B5B420C48E9DA728341C8BD22282B4FA79
+ 85565EEFF206CB5241CD079E14AA4DE1F34ABB8119BAD0D243CE40199917CCB2
+ 3F7B724D63D049CBD37FD584A51EF7E53A3297E5F9A8DBA58CFB6746E258BCDE
+ 736FC713DCCD72DA48C10C8AD3AE303A4E6E9A29015859716797D91966EFB182
+ 956646EF105813B5C2D4EB2B043487C74FD81A959F64044D600F9B3D929E6CB4
+ 88D253E29BC3F5C36479BD7BD13902FA803471C7FFADF55DF0553C8805B0096B
+ D35AA468585EE5D21988145E0BA84882C0A84E3DB3AECB7EFF802842B63DD28F
+ 783B7197C2D70C037482B93BB4177696CAD35EAC803FF86C752D773655CB83FA
+ 99549EAFDC36827AD73A1031C46A8046BAB228D0F867BC33ADA72A3B76CD0B72
+ D94C5E0C16A84E503823920009C055C3D2889C2145300587C51277D55F545D76
+ 5DA03A17AC572E0954914B483350FF531BD77502787E1FE3473D6222C37E1446
+ 941C3181C6DE6E7CA2892E977098760A0C3CCCB70C6E7D6C99231778CFCEC8B6
+ 8FDB6D70786209C78BF9B44FA7E3E297A797515D8B7EF5A15DE317C98D652836
+ 3CF417CCE42F6F7F6C50C352FAA2838246B8DDCB296722EE047A1687B9287ECB
+ 1F1639C79243476DEF2CF2D3316EAE043DC458FA958C4036F5B8C6D155135DBE
+ 35EB8F3AAB63F6A045305B79451E0640610A274B4732CA5CD77F64F8D9378445
+ 5D4E0B4B7129D05D6D84027DFCB5E173BEEC3AFFF7557A743E2B1D53CDA9B830
+ F67022AEAEB60BAD78DB4393BE5436BBEC0214E19E38935EE95E17D25950B80D
+ AFFEEE14FFDA2377802B0ADAB8680190E91C48BFC367CC8B7C279B1579E58978
+ BEA7B519637C5E1538AA41327EF6B16E2D788A6E3763D21EE46CAE455E2AACC1
+ CA6459610AEA736646CAFF7C9DF484ACAD28D0C07BF74725261E7DF7A43AB4E5
+ BEAE90BB3393DBE5A0F66D0D72A1EF4189B280157AD6BD25163E40C65B4D9DE0
+ C69480842AD55F6E4C81713DFEF7BD54A8824680B549AE971F5849A62CF496F4
+ 27AD0003427BA68FBD3B1249ACC47EDCE42941ED2F7284F0CA723F079F055FF0
+ 5496474F09BF91A50D606691A155D122EDD41A612386D09171B36092EAA5AA98
+ 994C826BF335F59C6186DB7EED2DC45070B1686EAE2236C7CB62F533C8948CE7
+ 296043810FED86D93462FBDEBDB7C94AEA44DBA52225BBD1B7CBDC1B377C2424
+ 8754F837D9A1861C0981A27A7D1BB664DC495AD95C3FE9384715C65A49358A8B
+ 6963D8A6D148B3C9DB61C2D00535E2DD735A698CC269AACEE5C0CDA8D5705401
+ 782279FB88673726599C3ABEE28B947F1CF558B99AE80BB580F330C7203C4EC5
+ 6DF3E7630C012B8565E5A56E038261C8BA7BE5109EF6EB7351F14139E97344C2
+ B1D256F51DBBD6F104D404175A372B055250D6B16F8B1E33B8ACEC05F55E9540
+ 24FF7A890F05EB86D38B144DB86C27B56B46172EFE0A0DAB6BA64CFA90D46EC2
+ A403A2BB455ECD1AE6BE832C88CDA1CC51A1F38FB0366F0B843F4F67D7758F3F
+ 1D020BB9FB3AB71A5AF4DA742B94BE57B6BCA1406EEFA087C872470B249E9E7D
+ 517CDC51A82ECB9A3748B661931B3D65E2BC8A378B3B74C9E80FF70CE0ADDB42
+ 3B17AA1F1890763C3DEAEEE9C83B2DBA545E01968BA00B8B388C435796A37132
+ C484CC148D216800F67C1970D6C14F12EBFE842D32B148D39E06FC176C4FD21A
+ E44F2AEEA1F6E06C0A9D8C06C1DFA627A24BD35BA7B68BBEDDB25B0014EEA33B
+ 045A0B85BEF4325432DBF0AB714834A8EB1B4F94C33B7C9DA73F7ED9605B6164
+ 77762DDE94338BA9F5CFE99168CD0EA2D836522E6769F73A104D9622CB3F18AB
+ 545BC876653811F4613B6B528B7BAD7F232A5320FEB2D9185D4DBBA47DE847FD
+ 3A0F19BAF289104348F90F6A82794737C45E9438E21D1CC620324A21C400C42B
+ 677404BE528F68846E4C89675CBB76F6FD20FF0A593931473FD021BA78089F3B
+ CEB657595322E89E066242458E9C3CE6E6DC54F632FB4B8719C429AB6B76409B
+ 93EDF64B58BA7D83BE1D21367D861DDC41DBCA7E5E7A8AFCCE26C1659FD58C96
+ C493C613440492426A3AF5597CFDD817541D03D4A6D88BACB632D39AC3AA19EF
+ AECE2D29D81A0393F2A97A6992797805DE65A19E2B65AD7F72E7A9A5F88F117F
+ 437D1B9BDF95625E1E76C8B7EC7B94DD53DFB66FA51549EB6685477E5BD081B5
+ 49AB3BECAD5CB3D4DD4B56340E23735067DE383289C1720290680D1F77598B6B
+ 378FFA5ABBB5A87A4D22085564F8616913BB7E07521B67C9FC268FE3228CA49C
+ F26B92C4F433B78DD44C8CB4F0423EF5BC481C44AA8FA15280875E3B2B7A0052
+ 1E36E5C84BD6B09752FE7FB8F94D66FF16A76B04FC65754B3C9710CA5FF23F7B
+ CCF33A76DF9690E8C90417E8FD99C39D773F4EC5B5442D8D43D97373E6982672
+ FAA56E997D74F328EEBBA0A29BC7DC28FEE02C48A180D60716F979F354B42928
+ AB03E1AD54A63461EA2200685F6AFA28A005530A4C1FFFA94DCDE5C3C83FFFAA
+ 3EEAB024CD5F14BF27C61AD944B5947C22A3CD862D6C1FCA4C98E37BE07B1E3A
+ E47113020469B2B481F063099D74403CE20423739D8586D619696023F507F607
+ E6B3667A9796831D20B2F18ACABD25E724B8CC440673F79A457837B1EA4484DF
+ 092BEBCD74E473D955394F3FCD0C8D18E12863D1555B4D84596AB9C5ADDDF927
+ 65FB3500FA7D375DA07F4333ABE05B69CB603C4CA84B81102ABA52D45D1BDB04
+ A638BCE4E0D6BD2FA2E857742BE0F412595B3DC66CFD14E49481666A3286688F
+ 1ADD11AEA63DFD245BB52003B978C29518895804ADBF546E8AC43957EA50838A
+ EFF79ADF78EA9199A8DEE8713DE4B28AF51842FBF6C2048D1239D68FAE3351ED
+ E3BDA8E9FF4AA952F7A9820BE3ABC3300D7037
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMBX10
+ %!PS-AdobeFont-1.1: CMBX10 1.00B
+ %%CreationDate: 1992 Feb 19 19:54:06
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.00B) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMBX10) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Bold) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMBX10 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 65 /A put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ readonly def
+ /FontBBox{-301 -250 1164 946}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82
+ 7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378
+ 77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18
+ 2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91
+ FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F
+ DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68
+ 7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4
+ 9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176
+ CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D
+ 6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6
+ E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E
+ 8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E
+ 3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99
+ EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4
+ 0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9
+ 4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209608D3976637A
+ DB9C73EB3A28623DF758C25574D740385B2C3D10086AEB904A33DD76DA2CC4BF
+ 7E37F9117E9D81D3EFDA12D5BDF0067450C5A8A53959C055C5D6087F1FE6FB5D
+ 8306F16FAD71AB986320F1229440C63ACB5FA24E41CFEB12C2BEA2C25E59A3F9
+ 6CA5B7A04B57F2471D36F5B41E6363DCEFF2DFFE9131F044125884739392333E
+ 15418156EEE8DE92EF4C176742032FE8889839755D8D821CD7F8FAAF8A22C283
+ 19F79216C6D454A864898EE9F830DB5F3372B8F47C464DF19C69ACB3BC0566E2
+ F25E7FF148B2CDA2B90CB5884440F464CD57295728A4415963CC1BC0635BBEF4
+ E812CA5E0E788035873D05616F7B0F6A30D36BB285E7955CFD860345F16D952A
+ BF2F7D2702DB352D0874442B2074859EB49313BC27E1067D627362649D82A5C3
+ A57DC5041B1A13FD2FA89D875019E23C31650A25CBEEC6B93C575C363FAE2164
+ 76ACBDCDFEFC8B7BD24AF41D55196DF6FB2F28DF88349947B448513C7E832EB9
+ F35B28EF86C231336351C1F89AA9AB1F8C02D0DC35746E97C2B29B7A44CF7418
+ 89DAE02563F58C453F45C231219FC9727D5D477B256530D4492AE7E4E3CBA90F
+ 50E8BAF9435EBFDF819DA9EE1F6F67A0D65D35E3D0EF63274B611B25756461D2
+ BFEEF8BFD513B0380993B8D52A6546D69773D67A15C059E6A89CAA2772162509
+ 3B054860006DEA20685F5E2937C95B50D07C6316ABC08495EF319B36F8E48FD0
+ DA482F82D2D981C70ADA2E467608364EC664D151BCE2FDF571BA63FC926CCD72
+ 052D4F83933A9585C0E033CE579227FB5BE2D58E048044B5BB6869ADFC2E03C7
+ AC062D709CC07D8E4377D75506A96CEC17A90E1FBEF6E3778DE10A910F346C4E
+ D33D753F6EC32D638BBDACC51CF22379D24C2A0780333AB3CB5A612C14381B3F
+ B7E42E841B123CBBBA6C33C080F9C6D370A91F29A4CA724B9809042BE9B2EDEA
+ 366C4D17F80C7923C9DFEB1C184DA0C0396BB3AE8446D1FDD7C76397076DDEAF
+ 4FB188394902EAC1B9126016723FBAAD27AD91C44C28F1D579989D8C3B5D6AD1
+ 1647504F2F6C38F1786DB3C9DE2BD6CA02D74451FDF6161DCD51706D62B383E1
+ A1E9F0D97F9579FFDC844710C4D9EEBC5F048B0811B8F3BF2BBA45C9A57E7B27
+ 48BD0F25113B884DA2D1596E14FCC7FE2B528806F4D61BB6A6D34E85AFF5193F
+ 7B396AE95ECAD67587C51633CB0F12327BB56E36C5E7EFF9437D80C2B337A480
+ 3EAD6F51E3475A8638B233545B633EABEA2EA89D7CD3A073FD32A1C5DFEE4ED7
+ 402DCC2E2CC4AC399619B272A5456E735F1044685EF0EC8BA6C242D5A029204C
+ 6E32D78226FC39E9222F7AD77F162827808F98CEB740B798BAAA7BB865A33D74
+ 7F9BA33CFF09800B9AA6510B69D56879E622C0DA900ACDC80ABF49DA8FF037C1
+ 10E4895F9E7F4B8246CBD2FD28AC913D3B0147C581341EA56830AF49D0B7687E
+ 80D121A40423228D29D5F22A9F22913FBA87B15F41432F959BEED884DB1C93B6
+ 7DE4552BBFFE84C9E2360683DCB43C0E681F0945108743BB6575CB7309C24A67
+ 2425339DD052C60EC1078B0A616A27ABEE7E2497AF4828C7BDB575A58B6030FC
+ 0E85DE84DC7582B90A52A3B92603D9E4B7783927AA86E4852AD73A6778EEDCC3
+ 247CBB6E1BBB86C623C32AE9423CFE9CF0B18120586C175EBC48D9316EA60EB1
+ A5E3FEC32F161EDCF932F4AF7AA246C3BFE8FF0D713C6DEB68D4C6E4CC875527
+ 05C9DD26AA09E678D71CAE88708E18524FE4BBFF93985D4914C4130240161786
+ 3EA170867A7B84C2AF727C6395F693149205B4B08CF2FFECAF913AADF8E8FEEE
+ 009D99E3CDD6E87EDD3650E37BED4BAB4FC0E7D6492BCBCC5B7BE50E721FCAE9
+ AD4184AC780A88FDE9227023DBC0D60D47A1307331CDE967B5384758D67D68AC
+ DFE77637CED76810EEBDBFF5BE7B3E72DDDE5EDAFC0C112D9DC105949B9AF343
+ F60AC374F17A4C35B1BAC99AF1E897F4E0931B574B69348D42329BA8486541D9
+ 8977C18C5919612C1194CC0DBAD03A2514456D0A9B60E0850B082B1E3EAD85F5
+ F7F7A0E88EE7C3A54718759E4791CD9E8E0F659CF2223314F0D423151ADA8AB0
+ A37AC3679F0B449A6B891111F80B5F656F1B639BA1733E612F2BC61EB2FC561D
+ 7F570755DA4BC31BDB57069853A329F96DB79B0BC62EC34CDDDE440F89F72B5A
+ 01084E5E358380A85E0DD49CE5EB0D2D854B7A5808CDFD7D0D6EE65BFAA92397
+ 537A2A18D8D9062206FA378BACF63A2AB05E06803F242F7F0D44B7D9ED0E8B7D
+ 0E38326A92527306BFE035911B407F4E52A3C036BB4BE3F3ADB9381AA6A9148B
+ BE42436D9C6BB6367C54B5B8723F6D6A313FB1C020C34A3DA5200227E2EEDEDF
+ 50E0EA92CD11E476448AEAFAE287D1AB2FCB2288515A49A7AA6C177E404E094F
+ 4FBADD50A28D9EC02BA53198A90DFA1B0A32540587368812EE69E5CE2A3DE4DA
+ 7EE49D0124C490096FFECBE1C84E657C31CAF3F935AA5568833661EDCF12D007
+ 8EA634F61DF6FCDD443EA994B595F6D273BEEE694BAF1B63BE00D2815DF3B09A
+ 51650B9103C36B83967C7D53A1B272CD0221BC568868B41827EC6104520C4EAC
+ 5C52FA8D40709369FB0B16C6671F636F0B7F0136E077665F380A81FB02EFAED1
+ 69BCDCA9B8B18883475AC4CE73455A5892E90D0FA359B778A55BD835DCEE1082
+ 880E07028E61A7217C1CF8349AAD2B2BCF68C59E74DFA32AAA40824BC9478FB6
+ B30E20BEE58CA400C9E8F89E875D6B2B358A6C916BE058F33D363537E1243FF3
+ 11F1BDB339D9413911FABEFDDA7CA25C7B769360B335953B1186EE2430243F1B
+ 511B6B1F4016A98F4E56E58F7F0F6B945C59AE0FFA3706A4BC08B9905BB78E70
+ 0DDA17F6BC111D17A1883E5F47846B37075745C761F5CB638C7871B2ACD35FDB
+ 004738456B5FEF221F047117E1102EDA7714040C1A1C489F09D31F312438414A
+ 87BB04D6149166DA0C8718D00C3D7C9B8BBF0CB99DDB32C4B1F7F62F2D9D97EA
+ A248CF577B9A47EE40028B51D637AD
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ %%BeginFont: CMR17
+ %!PS-AdobeFont-1.1: CMR17 1.0
+ %%CreationDate: 1991 Aug 20 16:38:24
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMR17) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMR17 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 58 /colon put
+ dup 67 /C put
+ dup 80 /P put
+ dup 83 /S put
+ dup 97 /a put
+ dup 99 /c put
+ dup 101 /e put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 107 /k put
+ dup 109 /m put
+ dup 111 /o put
+ dup 114 /r put
+ dup 116 /t put
+ readonly def
+ /FontBBox{-33 -250 945 749}readonly def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5F075EA0A10A15B0ED05D5039DA41B32B16E95
+ A3CE9725A429B35BAD796912FC328E3A28F96FCADA20A598E247755E7E7FF801
+ BDB00E9B9B086BDBE6EDCF841A3EAFC6F5284FED3C634085BA4EE0FC6A026E96
+ 96D55575481B007BF93CA452EE3F71D83FAAB3D9DEDD2A8F96C5840EAE5BE5DC
+ 9322E81DFF5E250DEB386E12A49FC9FBF9B4C25C3283F3CEA74B8278A1B09DA7
+ E9AE4FBAAF23EDF5A3E07D39385D521547C3AAAB8EB70549756EBA8EF445AF4A
+ 497CA924ACCC3DD5456F8E2C7E36946A5BF14E2E959895F7C94F49137256BE46
+ 4A238684D52792234869EAE1A6D8ADF4E138B79472D2A90A6CA99E2394CC20CD
+ 3841733046175B20CEBE372327BF13428EED6A3E2FDF84C2DBA4B0AD584EE9DF
+ B51828D3B8F385846158C29C9AC3496CB9692DD10219697B2ED4D425C3957FD8
+ C4600D76E045C561216EF05D38177243C314877A69A1C22E3BEC611A2EE5A216
+ 9B7C264CF6D1839DBBD78A40610F2C0D7C2FE09FFA9822FF55035AD52546970F
+ 83EED2D30EABB1F303091EBC11A5379B12BB3F405E371519A53EA9D66174ED25
+ A2E55463EC71A97BE4C04B39E68112956117C8252DB6FB14AB64534B4BCD568B
+ 246DB833982B38CDE7268BBF74B6B0C18091E1B1F87D32D66F4DD023D1F10D2A
+ 7736A960F72AC01F733A11023832CD68FB6288A5977743F781214D8FA9C0C3F7
+ 80001321D4397771F728FD9EE57CFE7D9192B887EC883EB1505068261DC40089
+ 7B7D2820F06515CD74513521F6397FEAB3AD3572D9A8269430E407E357422461
+ 1785FC2782047F4C0339D79B16862D939F3A37F78E4E2174E4FBF132539CB760
+ 207999FF86F6A3EBE48EB0A1CA635450FDEEF79EB16D853F3BF4B41B05588453
+ D4417AEA07EB3348CA1A966A79C33123B0F93E7D01E200BFCED9C60B86F7D131
+ D6350A63AF4505C4A60F0FA4F4B8BD56047A3269F1E8A3CF1F675BE52929E17C
+ E33E66DE59E5ABAA4B85D3B2F1040F95CE7C290EDE34C96130ED331FE9C276A5
+ 30342712664E23C2957E172EA090368B31C782760015B314AADAEEC9DFB8A1C1
+ 38BF7F6D44AEA35D9CD1FF642C01F7E36A8E85E119D3B44D7078AF65FB1C9417
+ 97FA59214C1B346493EC85AC39A8ABDA36D48EBF0E920C283D261DFE5E1BBFFB
+ B2A7B1A8D2C722BAAF41F9B03F0A69F157E261DE67BA6F1C4A8DB980E43E2CBE
+ 598BA5DEFCBEBF5836D823FC66BC83BDCED6D1F69615F55CD3930E2E2BD49BCA
+ 63E4F83F4F448C13AAF18B01AB6F0817A56307AB1D4912AE9B327457A0EBADDA
+ CA9B2AFC8917FBD7B1FCB1BA4572BC44FDB52819F721DFC90835801DB7442B60
+ DB89245CD0859D798980CE37724FCE60F4696001405CF63963B4E76E65F3D1BD
+ 00D175E7C8669864185E8906B76E9A3EFE5CF097325CF5D264F4381172964F14
+ 558DD5053FA13183276D51D9D01BDDF0880B6CD696486972984FE13693A3EE12
+ 562B523713E95C5A9D9B4716825F3D5C8A61297E96D11BAC1FB1D1BAACA485CF
+ 3ECA8BA2D261A7D156D262349F2AB39554C19BA60A118F5E5D98EBB58F4E76C1
+ 3ABA32A58C25CE3DFD46990C8E1CC36D4B0FD11D9E9E927DE9A02986C1BA0020
+ F5215A5C7A7308085DC9735F76E4F09CC8DD0AA0552A76C575E4A145F672F564
+ F8C05D189FC03B4509532FB68CACF0ABB6AC6CEFA910C4E10B77806F14A7A417
+ 49960F50544CA0886F2E56EE9A04D3C9C2C1A6C945E6319E51C9C7C664B901DA
+ 273BF9E9A1951B966F46B9B4577673786FF3D3D283F49698FDBB84A88BB68A71
+ 13E9B78BFF2729F7588F7F0DB608B76F0295EC3FF8D2EF5CCFF0C07B01DEB053
+ D414A9B8C735FA860C13547A7B349106145EBA5FC0BDFABFA0E0466CA475A3B7
+ 0BAACD44D7C33EE374905D9CABD070410A01EF50203243ABA5789AA7FD3F05D4
+ C2015F7C19EAED2B392D7280BF66F8628BE5342914B2C1C189120218207F495E
+ 53AD7386900F68065741BD18577B82F392E3C83D53F946A984CD17A183332C97
+ 37686DF148050857B775B2F0C8F3D0D3A95895E3AF422C918C5A3FB203AC2DF5
+ CEC07644C0A70F877D132E274E4D8B964D3FAAAA653CEFCECA95D92F2A811227
+ 8C8CC38E09A54B064946CABB2E97D30D8CDE91570DBA6FAC49D4B4623A27F170
+ 987A29FE287B805589183279D3768860054C7E4B1AC9AE2E0C3F211275B57922
+ D954F391CF4BDCA91A8021AD21D1D2FB341C5EC6405B4B098F3CE57A506DE9AD
+ AA925745A318DDCD5EA6966E355C34434F9E8D9F6D0DFC1640294E13BE8AC5D5
+ 7FDA13EDA62AD70E898328D80EB3CEF977B9D71B43B68B07C62DF965E90E81D7
+ DF74D7D652609C08070DC555681BC1E581F18E4FC9C23A5737BA2F0D8E18DE56
+ 1870B21F67B6F07DD0525AD2A82FDAE846462C97727D135DB7FEBCBABBA3806E
+ 9DCE6320867C270D69686C5B99DFE40B99FC4E34B6D4DEAC3B85A9A58779AF60
+ F576C92CABC9CD4C9B9CDAB45D6EC847DB77B7EB705E2CB76F294972E83ED24F
+ E6B20A35BC70BC363737992C6691F82A226620D10AA6955E80D9E08E41BB7488
+ 4836A16BBEC99CC830491D9CD15B32F64E9C8D96D06A5BC40CE943EE6AE92898
+ 7139014BA31765686BE9B71117667F89F2ECEF228FED45F7BEB7C086EA1906E7
+ AEBA8D8B04677043F4FCE166118A0FB000340051EE91AF3D11D62E26EEC35333
+ CDD62C6694160F316D58DC89697B6705157F1E88828BDEF29DF25E555AB0D906
+ C941D1473D1EA64C95EF1CAEEAD494398329763F75A67B89A0C9304AFA25F070
+ FBD52F1B2FF2BA76CF33F8214955FAC03204DE75C7FACAE42A6C2EDD9FF270B5
+ 254629A1FE3773C82A01F4ED59C2E98367480E3F576D50EFFD540513DC9AB623
+ 7F8B7CA6F0B37FF6E8DC04CCED2E9D791D6BE10920A82198877D3D8570A6FAE1
+ 577A7079160EB9982A4FD308766DF5E54BBA5E8C2CBFE0C7450D8374B7051B88
+ 3B3D6A7E09FFD920EAABE8A7DDBCEA288055057464CFEB57BCCD6E32B2C7E10B
+ 43105364B25E74637BE25173B674BBC0A5B667D153898833A97A92FD602A0FC6
+ D213A995B7EDE1DB439C1193E185A7EFCF3D9736A8A5EA859DC5C2B61804EE22
+ 54F097B73E8655633CAEDF547A618F8A79224A8615FD2DDD4EBE0F56C838944C
+ DB1E8D6055B826069B10152AB6F1C347EF475A5A7F619810B8D05E8ED1F1CFDD
+ B1B9C2ABE6321D9A85354B6E8AAF553830CFC835B5E590C6EBB42DA6F80F4269
+ 79D66614517B99AB55B8B6BED7FFEE4BE00EFC71BFB545745A929A70739E0E82
+ 78C5E15DF6DD79457E13202E2A911FC533C90C9E5B6C413CC60B9FEFC77BF45D
+ 6C531E2549CBA84D62F804B9789AC8D58F8CDFD1DDB6189749BA98DF2BF98E5B
+ 15AFD57A790227757B40038112117734A9EAF8E53C578ECBD549A4C0E1B879DD
+ CAE241CCFA974590A226407AE7D8E454B82B471D9AA643351B304BDCB6A0CF44
+ 8EBC7FF337DA8BFF54AC346633A13F8D5033CF35C38973BF3858E120BE515190
+ C12844834D4CE13515DE76888E4C50236FD1CB3DC96576714FFA8CB8277E77EB
+ E1A4BA397B7505D4804BBA88446CC32714B1DB113E4A4076DBFDA6D3098F425F
+ 5FC438C47ABA521FF14749220CC7B711DD0CE8B0A10CAEBD4BBD3306B396F645
+ A6BDE21E35D8A7CE0011B8E6F652461F7AC3BE2C51BC453FCFE400550D5EC206
+ 64E0426B15DB76D98E5F8F5D0BB1CE3BDAC5706D6347056145ED995997D5A6F3
+ 8AAD096B65097C4A7F747A6E7A9F63AC53BB0A46A730E539026270C7F4763720
+ 94D3C7D451CEE38F9D85CD36A9E0C89AB31464106235663E1A642BC4DDA68712
+ 5F65115B60E6F37FF437CF5F096D85EEFC31C7EEB5A452D4CBF46CE4F0E07E3E
+ EC63508DF76C165A2736B51C7AE2C4D38872F767E1F06D089053817B06867F1E
+ C827929D37B8BBD517F0F3831224184D25AF5C841E56D2B8B20CF1C603BA14A4
+ BAD17C093217AD77C893AEC5F6FB51568BD640A0C8375AB042EA638F3AD94BB5
+ B9FEB2BCEBEFBDFF51B21C6903951BD9E9A1E540F6B3D626FC9D2A4EF8E96236
+ A5A190D5277335DABB393F11211C01750390F7103E80F5F0A317A5507AEEE20E
+ A57A42CA387919A77EB72552E8FFBC161128940D979FD30EA2E7DC46F42C55DF
+ A710F768DD87055A399AF3832725552E25327BBDE54A63026F571CEF9CD856C2
+ 6F06AA22C3B53A7CBFEC9656F0301729E45582C9BC3AB37D8F173E1F4842BAEB
+ 7343A6EAA5597773209E3549991EA22CE2029890E0DE2F5127A01F183483652E
+ B65D9643309093E9AB75B25466148F5CCB5B94B9CCDAB0AAE89D36FEF845B6BE
+ 31666C1392E9F68AB8FD255EEA40892EB61F06A14E48455C3B940DB951B19411
+ 62C4B3CD33B7776891DB1E05B532070F8C80DF057AD9C42308E188A1D2F0F9D8
+ F5EA5A0625337DAF66F7CBCE69CBE5DA51A0F2E323D54FEEFB1A1AFAEC84CCB8
+ 12634EE12962E0C47D2BCEE0787773D2145A6FDC10
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont
+ TeXDict begin 40258431 52099146 1000 600 600 (thesis.dvi)
+ @start /Fa 133[40 47 3[52 32 40 41 1[50 50 55 80 25 45
+ 1[30 50 45 30 45 50 45 45 50 9[97 2[70 55 71 1[66 75
+ 72 87 61 2[38 1[75 1[66 74 70 1[72 10[50 1[50 50 50 1[50
+ 50 30 35 3[40 40 30 75 38[{}48 99.6264 /CMTI12 rf /Fb
+ 134[52 4[52 3[52 10[52 101[{}4 99.6264 /CMITT10 rf /Fc
+ 145[43 110[{}1 66.4176 /CMMI8 rf /Fd 152[50 50 69[100
+ 16[50 15[{}4 99.6264 /CMSY10 rf /Fe 205[35 35 5[55 43[{}3
+ 66.4176 /CMR8 rf /Ff 134[48 55 9[58 4[33 6[41 51 36[76
+ 27 27 27[58 30[{}10 99.6264 /CMMI12 rf /Fg 130[51 51
+ 51 1[51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 1[51
+ 51 51 51 51 51 51 51 51 1[51 1[51 51 51 2[51 4[51 12[51
+ 7[51 51 51 51 51 1[51 1[51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 1[51 51 51 33[{}61 99.6264 /CMTT12
+ rf /Fh 134[71 1[97 2[52 53 55 1[75 67 75 112 37 71 1[37
+ 75 67 1[61 75 60 75 65 10[102 2[75 100 1[92 2[128 81
+ 2[50 1[106 85 2[97 96 102 12[67 67 67 67 2[37 46[{}36
+ 119.552 /CMBX12 rf /Fi 131[98 49 43 51 51 70 51 54 38
+ 38 38 51 54 49 54 81 27 51 30 27 54 49 30 43 54 43 54
+ 49 3[27 49 27 3[100 73 73 70 54 72 76 66 76 73 89 61
+ 76 50 35 73 77 64 66 75 70 69 73 1[46 3[27 27 49 49 49
+ 49 49 49 49 49 49 49 49 27 33 27 76 1[38 38 27 76 81
+ 1[81 49 27 12[49 49 4[81 54 54 57 11[{}86 99.6264 /CMR12
+ rf /Fj 134[59 2[59 62 44 44 46 1[62 56 62 1[31 59 1[31
+ 62 2[51 62 50 1[54 9[116 2[78 1[84 3[88 4[42 2[70 1[86
+ 81 10[56 56 56 56 56 56 56 56 49[{}33 99.6264 /CMBX12
+ rf /Fk 134[85 2[85 90 63 64 66 2[81 90 1[45 85 1[45 90
+ 1[49 74 90 72 1[78 9[167 2[112 1[120 3[126 4[60 2[101
+ 2[117 12[81 81 81 81 81 81 49[{}30 143.462 /CMBX12 rf
+ /Fl 134[48 1[66 48 51 35 36 36 1[51 45 51 76 25 48 1[25
+ 51 45 28 40 51 40 51 45 12[66 7[57 8[66 1[68 18[25 30
+ 25 31[51 12[{}30 90.9091 /CMR10 rf /Fm 139[41 41 43 14[46
+ 58 51 31[79 65[{}7 90.9091 /CMBX10 rf /Fn 134[62 1[85
+ 1[65 1[46 3[59 65 1[33 62 1[33 65 2[52 1[52 1[59 18[88
+ 1[73 1[60 18[59 59 3[59 1[59 3[33 44[{}21 119.552 /CMR12
+ rf /Fo 139[61 1[61 2[79 1[133 1[83 1[43 88 79 1[70 1[70
+ 1[79 13[88 2[108 12[115 8[43 58[{}15 172.188 /CMR17 rf
+ end
+ %%EndProlog
+ %%BeginSetup
+ %%Feature: *Resolution 600dpi
+ TeXDict begin
+ %%BeginPaperSize: Letter
+ letter
+ %%EndPaperSize
+ end
+ %%EndSetup
+ %%Page: 1 1
+ TeXDict begin 1 0 bop 720 951 a Fo(Chec)l(k)l(er:)69
+ b(a)52 b(Static)g(Program)g(Chec)l(k)l(er)1486 1246 y
+ Fn(Nic)m(holas)37 b(Lewyc)m(ky)1620 1479 y(June)i(7,)f(2006)1743
+ 1846 y Fm(Abstract)704 2014 y Fl(Automated)48 b(soft)m(w)m(are)h
+ (analysis)f(is)g(the)g(pro)s(cess)f(of)g(testing)i(program)568
+ 2127 y(source)37 b(co)s(de)h(against)g(a)g(set)g(of)f(conditions.)62
+ b(These)37 b(ma)m(y)h(b)s(e)f(as)g(simple)g(as)568 2240
+ y(v)m(erifying)i(the)g(co)s(ding)g(standards,)h(or)f(as)g(complicated)h
+ (as)f(new)f(languages)568 2353 y(whic)m(h)30 b(are)h(formally)f(v)m
+ (eri\014able)i(b)m(y)e(a)h(theorem)f(solv)m(er.)704 2466
+ y(Chec)m(k)m(er)j(is)g(able)g(to)g(\014nd)e(t)m(w)m(o)j(small)f
+ (classes)g(of)g(errors,)g(one)f(is)h(memory)568 2579
+ y(faults,)e(the)g(other,)h(non-deterministic)f(b)s(eha)m(viour.)42
+ b(Lac)m(king)32 b(in)m(terpro)s(cedu-)568 2692 y(ral)e(analysis,)h(c)m
+ (hec)m(k)m(er)i(can)e(not)f(b)s(e)g(applied)g(to)h(real-w)m(orld)g
+ (soft)m(w)m(are.)324 3025 y Fk(Con)l(ten)l(ts)324 3244
+ y Fj(1)90 b(In)m(tro)s(duction)2419 b(2)470 3364 y Fi(1.1)99
+ b(Static)33 b(Single)h(Assignmen)m(t)54 b(.)c(.)g(.)g(.)g(.)g(.)f(.)h
+ (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)138
+ b(2)470 3485 y(1.2)99 b(Basic)34 b(Blo)s(c)m(ks)41 b(.)50
+ b(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g
+ (.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)138 b(3)470 3605
+ y(1.3)99 b(Con)m(trol)33 b(Flo)m(w)g(Graph)95 b(.)50
+ b(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+ (.)f(.)h(.)g(.)g(.)138 b(3)470 3725 y(1.4)99 b(LL)-11
+ b(VM)34 b(In)m(termediate)g(Represen)m(tation)59 b(.)50
+ b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)138
+ b(4)324 3943 y Fj(2)90 b(Related)38 b(W)-9 b(ork)2353
+ b(7)324 4161 y(3)90 b(The)38 b(Chec)m(k)m(er)2413 b(8)470
+ 4282 y Fi(3.1)99 b(V)-8 b(alidit)m(y)89 b(.)50 b(.)g(.)g(.)f(.)h(.)g(.)
+ g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+ (.)g(.)f(.)h(.)g(.)g(.)138 b(8)470 4402 y(3.2)99 b(Addressabilit)m(y)47
+ b(.)i(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g
+ (.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)138 b(9)324 4620
+ y Fj(4)90 b(T)-9 b(ec)m(hnical)38 b(No)m(v)m(elt)m(y)2106
+ b(11)470 4740 y Fi(4.1)99 b(P)m(oin)m(ter)34 b(Analysis)d(.)50
+ b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g
+ (.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)89 b(12)324 4958 y Fj(5)h(F)-9
+ b(uture)38 b(W)-9 b(ork)2348 b(15)1918 5251 y Fi(1)p
+ eop end
+ %%Page: 2 2
+ TeXDict begin 2 1 bop 324 548 a Fj(6)90 b(Conclusion)2445
+ b(16)324 881 y Fk(1)161 b(In)l(tro)t(duction)324 1100
+ y Fi(The)44 b(\014rst)g(stop)g(for)g(c)m(hec)m(king)h(a)f(program)f
+ (for)g(errors)h(is)g(the)g(compiler.)78 b(Mo)s(dern)324
+ 1220 y(compiler)45 b(design)h(fo)s(cusses)g(on)e(e\016cien)m(t)j
+ (algorithms)d(for)g(fast)h(compilation,)j(with)324 1341
+ y(compiler)33 b(w)m(arnings)h(coming)f(as)g(a)f(con)m(v)m(enience.)470
+ 1461 y(I)d(examine)g(the)g(p)s(ossibilit)m(y)h(of)e(using)h(mo)s(dern)g
+ (compiler)g(tec)m(hniques)i(to)d(pro)s(duce)324 1581
+ y(a)h(program)h(c)m(hec)m(k)m(er.)45 b(This)31 b(is)g(built)f(on)g(top)
+ f(of)h(Chris)h(Lattner's)f(excellen)m(t)j(compiler)324
+ 1702 y(framew)m(ork,)46 b(LL)-11 b(VM)42 b(\(Lo)m(w)h(Lev)m(el)h
+ (Virtual)e(Mac)m(hine\))i(whic)m(h)g(pro)m(vides)g(a)e(C)h(fron)m(t)324
+ 1822 y(end,)g(an)d(SSA)g(\(Static)h(Single)g(Assignmen)m(t\))h(based)f
+ (in)m(termediate)h(represen)m(tation)324 1942 y(and)32
+ b(man)m(y)i(di\013eren)m(t)g(analysis)g(and)e(optimization)h(passes.)
+ 324 2231 y Fh(1.1)135 b(Static)46 b(Single)f(Assignmen)l(t)324
+ 2416 y Fi(In)22 b(source)h(co)s(de)f(form,)i(a)e(program)f(declares)j
+ (v)-5 b(ariables)22 b(and)g(ma)m(y)h(assign)g(and)f(reassign)324
+ 2536 y(v)-5 b(alues)37 b(to)e(them)i(throughout)f(the)g(execution.)55
+ b(In)37 b(static)f(single)h(assignmen)m(t)h(form,)324
+ 2657 y(there)h(is)g(one)g(unc)m(hanging)g(de\014nition)h(p)s(er)e(v)-5
+ b(ariable.)62 b(The)39 b(con)m(v)m(ersion)i(is)e(done)g(b)m(y)324
+ 2777 y(de\014ning)29 b(a)g(new)g(v)-5 b(ariable)29 b(at)g(eac)m(h)g
+ (assignmen)m(t.)44 b(This)30 b(transforms)f Fg(x)52 b(=)f(1;)h(y)g(=)f
+ (x;)324 2898 y(x)g(=)h(2;)33 b Fi(in)m(to)g Ff(x)917
+ 2913 y Fe(1)984 2898 y Fd( )28 b Fi(1;)17 b Ff(y)1253
+ 2913 y Fe(1)1319 2898 y Fd( )27 b Ff(x)1501 2913 y Fe(1)1541
+ 2898 y Fi(;)17 b Ff(x)1640 2913 y Fe(2)1707 2898 y Fd( )27
+ b Fi(2.)470 3018 y(A)h(v)-5 b(ariable)27 b(ma)m(y)i(b)s(e)e(de\014ned)i
+ (as)f(b)s(eing)g(equal)g(to)f(m)m(ultiple)i(v)-5 b(alues)29
+ b(b)m(y)f(emplo)m(ying)324 3138 y(the)k Ff(\036)f Fi(function.)43
+ b(Setting)32 b(a)f(v)-5 b(alue)32 b(to)f Ff(\036)p Fi(\()p
+ Ff(x)1934 3153 y Fe(1)1974 3138 y Ff(;)17 b(:::;)g(x)2198
+ 3153 y Fc(n)2245 3138 y Fi(\))31 b(means)i(that)e(the)h(v)-5
+ b(alue)32 b(is)g(equal)324 3259 y(to)g(one)h(of)f(the)h(v)-5
+ b(alues)33 b(in)g(the)g(set.)44 b(Consider)34 b(this)g(simple)g
+ (example:)426 3487 y Fg(int)52 b(x,)g(y;)426 3607 y(if)g(\(condition\))
+ 529 3728 y(x)f(=)h(a;)426 3848 y(else)529 3969 y(x)f(=)h(b;)426
+ 4089 y(y)g(=)f(x;)470 4317 y Fi(In)44 b(eac)m(h)g(branc)m(h,)j(w)m(e)d
+ (ha)m(v)m(e)h(a)e(di\013eren)m(t)h(de\014nition)g(of)f(the)h(v)-5
+ b(ariable,)46 b Ff(x)3279 4332 y Fe(1)3365 4317 y Fd( )f
+ Ff(a)324 4438 y Fi(and)37 b Ff(x)573 4453 y Fe(2)649
+ 4438 y Fd( )f Ff(b)p Fi(.)58 b Ff(y)41 b Fi(is)d(de\014ned)h(with)f
+ (the)g Ff(\036)f Fi(function.)58 b(In)38 b(our)f(example)i(ab)s(o)m(v)m
+ (e,)h Ff(y)f Fd( )324 4558 y Ff(\036)p Fi(\()p Ff(x)475
+ 4573 y Fe(1)514 4558 y Ff(;)17 b(x)613 4573 y Fe(2)653
+ 4558 y Fi(\).)470 4678 y(Similarly)-8 b(,)30 b(lo)s(ops)f(are)f
+ (written)i(with)f Ff(\036)p Fi(-no)s(des)f(at)g(the)h(top.)42
+ b(A)29 b(lo)s(op)f(with)h(iterator)324 4799 y Ff(i)k
+ Fi(from)f(0)g(is)h(written)h Ff(i)1174 4814 y Fe(1)1241
+ 4799 y Fd( )27 b Ff(\036)p Fi(\(0)p Ff(;)17 b(i)1590
+ 4814 y Fe(1)1651 4799 y Fi(+)22 b(1\).)44 b(An)32 b(example:)1918
+ 5251 y(2)p eop end
+ %%Page: 3 3
+ TeXDict begin 3 2 bop 426 548 a Fg(int)52 b(y)g(=)f(0;)426
+ 668 y(for)h(\(int)h(i)e(=)h(0;)g(i)f(<)h(n;)f(i++\))529
+ 789 y(y)g(+=)h(i;)470 1017 y Fi(b)s(ecomes:)426 1187
+ y Ff(y)474 1202 y Fe(1)541 1187 y Fd( )27 b Fi(0;)426
+ 1308 y Fg(for)52 b(\()p Ff(i)715 1323 y Fe(1)783 1308
+ y Fd( )27 b Ff(\036)p Fi(\(0)p Ff(;)17 b(i)1132 1323
+ y Fe(2)1171 1308 y Fi(\))p Fg(;)52 b Ff(i)1345 1323 y
+ Fe(1)1412 1308 y Ff(<)28 b(n)p Fg(;)51 b Ff(i)1709 1323
+ y Fe(2)1777 1308 y Fd( )27 b Ff(i)1937 1323 y Fe(1)1999
+ 1308 y Fi(+)22 b(1)p Fg(\))529 1428 y Ff(y)577 1443 y
+ Fe(2)644 1428 y Fd( )27 b Ff(\036)p Fi(\()p Ff(y)915
+ 1443 y Fe(1)953 1428 y Ff(;)17 b(y)1045 1443 y Fe(2)1106
+ 1428 y Fi(+)22 b Ff(i)1237 1443 y Fe(1)1277 1428 y Fi(\))470
+ 1669 y(LL)-11 b(VM)32 b(uses)g(static)g(single)g(assignmen)m(t)h(form)e
+ (for)g(its)g(in)m(termediate)i(represen)m(ta-)324 1789
+ y(tion.)48 b(In)35 b(LL)-11 b(VM's)35 b(implemen)m(tation)h(of)e
+ Ff(\036)p Fi(-no)s(des,)g(eac)m(h)h(v)-5 b(alue)35 b(in)f(the)h(set)g
+ (is)f(asso)s(ci-)324 1910 y(ated)f(with)g(the)g(basic)g(blo)s(c)m(k)h
+ (con)m(taining)f(the)g(de\014nition)g(of)f(the)h(v)-5
+ b(ariable.)324 2198 y Fh(1.2)135 b(Basic)45 b(Blo)t(c)l(ks)324
+ 2383 y Fi(A)24 b(basic)h(blo)s(c)m(k)f(is)h(a)f(series)h(of)f
+ (instructions)h(that)f(execute)i(in)e(order)g(with)h(other)f(p)s(oin)m
+ (ts)324 2503 y(of)30 b(en)m(try)h(or)f(exit.)43 b(In)31
+ b(this)g(sense)h(it)e(is)h(atomic;)g(execution)h(will)f(alw)m(a)m(ys)h
+ (b)s(egin)e(at)g(the)324 2624 y(b)s(eginning)37 b(of)g(a)f(basic)i(blo)
+ s(c)m(k)g(and)f(con)m(tin)m(ue)i(to)d(the)i(last)f(instruction.)58
+ b(Sometimes)324 2744 y(this)30 b(rule)f(is)h(w)m(eak)m(ened)i(to)d
+ (allo)m(w)h(for)f(error)g(handling)g(\(suc)m(h)i(as)f(division)g(b)m(y)
+ g(zero\))g(or)324 2865 y(exceptions.)470 2985 y(One)i(w)m(a)m(y)h(to)f
+ (build)g(basic)h(blo)s(c)m(ks)g(is)f(to)f(tak)m(e)i(the)f(co)s(de)g
+ (and)g(cut)g(it)g(wherev)m(er)i(an)324 3105 y(instruction)29
+ b(jumps,)g(or)f(wherev)m(er)i(a)e(jump)g(ma)m(y)g(land.)42
+ b(These)30 b(form)e(the)g(b)s(oundaries)324 3226 y(of)39
+ b(y)m(our)h(basic)h(blo)s(c)m(ks.)66 b(Note)40 b(that)f(this)h(tec)m
+ (hnique)i(do)s(esn't)f(alw)m(a)m(ys)g(pro)s(duce)f(the)324
+ 3346 y(largest)33 b(p)s(ossible)h(basic)f(blo)s(c)m(ks)h(\(and)e(th)m
+ (us)i(the)f(few)m(est)h(n)m(um)m(b)s(er\).)470 3467 y(In)44
+ b(LL)-11 b(VM,)45 b(a)f(basic)h(blo)s(c)m(k)g(m)m(ust)g(b)s(egin)f
+ (with)h(the)f Ff(\036)p Fi(-no)s(des)g(and)g(end)h(with)g(a)324
+ 3587 y(terminator)33 b(instruction.)45 b(These)34 b(include)h(branc)m
+ (h)e(instructions,)i(calls)e(of)g(functions)324 3707
+ y(that)i(ma)m(y)h(thro)m(w)f(an)g(exception,)j(or)c(a)h(function)h
+ (return.)51 b(F)-8 b(unction)36 b(calls)f(that)g(can)324
+ 3828 y(not)d(thro)m(w)h(exceptions)i(are)e(not)f(terminator)h
+ (instructions.)324 4117 y Fh(1.3)135 b(Con)l(trol)46
+ b(Flo)l(w)g(Graph)324 4301 y Fi(Basic)27 b(blo)s(c)m(ks)h(form)e(the)h
+ (no)s(des)g(of)f(a)g(directed)i(graph)f(called)g(the)g(con)m(trol)g
+ (\015o)m(w)g(graph.)324 4422 y(The)48 b(edges)g(connect)h(one)e(basic)h
+ (blo)s(c)m(k)g(to)f(the)h(blo)s(c)m(ks)h(it)e(could)h(jump)f(in)m(to.)
+ 88 b(In)324 4542 y(this)39 b(form,)i(a)d(cycle)j(represen)m(ts)g(a)e
+ (lo)s(op,)h(a)f(detac)m(hed)h(subgraph)g(or)f(basic)g(blo)s(c)m(k)h(is)
+ 324 4662 y(unreac)m(hable)i(co)s(de,)i(and)d(a)g(cycle)i(with)e(no)g
+ (edges)h(leading)g(out)f(of)f(it)h(m)m(ust)h(b)s(e)g(an)324
+ 4783 y(in\014nite)33 b(lo)s(op.)470 4903 y(The)h(program)1918
+ 5251 y(3)p eop end
+ %%Page: 4 4
+ TeXDict begin 4 3 bop 426 548 a Fg(if)52 b(\(t)g(\045)f(2)h(==)g(0\))
+ 529 668 y(print\(t,)h(")f(is)g(even"\);)426 789 y(else)529
+ 909 y(print\(t,)h(")f(is)g(odd"\);)426 1150 y(for)g(\(int)h(i)e(=)h(0;)
+ g(i)f(<)h(t;)f(++i\))529 1270 y(if)h(\(i)f(*)h(i)g(==)f(t\))h({)631
+ 1391 y(print\(t,)i(")d(is)h(",)g(i,)g(")f(squared"\);)631
+ 1511 y(break;)529 1631 y(})426 1872 y(return;)470 2064
+ y Fi(could)33 b(b)s(e)g(translated)g(in)m(to:)470 4413
+ y @beginspecial 36 @llx 36 @lly 409 @urx 496 @ury 2160
+ @rwi @setspecial
+ %%BeginDocument: example2.ps
+ %!PS-Adobe-2.0
+ %%Creator: dot version 2.8 (Sun Apr 9 22:27:31 UTC 2006)
+ %%For: (nicholas) Nicholas
+ %%Title: example2
+ %%Pages: (atend)
+ %%BoundingBox: 36 36 409 496
+ %%EndComments
+ save
+ %%BeginProlog
+ /DotDict 200 dict def
+ DotDict begin
+
+ /setupLatin1 {
+ mark
+ /EncodingVector 256 array def
+ EncodingVector 0
+
+ ISOLatin1Encoding 0 255 getinterval putinterval
+ EncodingVector 45 /hyphen put
+
+ % Set up ISO Latin 1 character encoding
+ /starnetISO {
+ dup dup findfont dup length dict begin
+ { 1 index /FID ne { def }{ pop pop } ifelse
+ } forall
+ /Encoding EncodingVector def
+ currentdict end definefont
+ } def
+ /Times-Roman starnetISO def
+ /Times-Italic starnetISO def
+ /Times-Bold starnetISO def
+ /Times-BoldItalic starnetISO def
+ /Helvetica starnetISO def
+ /Helvetica-Oblique starnetISO def
+ /Helvetica-Bold starnetISO def
+ /Helvetica-BoldOblique starnetISO def
+ /Courier starnetISO def
+ /Courier-Oblique starnetISO def
+ /Courier-Bold starnetISO def
+ /Courier-BoldOblique starnetISO def
+ cleartomark
+ } bind def
+
+ %%BeginResource: procset graphviz 0 0
+ /coord-font-family /Times-Roman def
+ /default-font-family /Times-Roman def
+ /coordfont coord-font-family findfont 8 scalefont def
+
+ /InvScaleFactor 1.0 def
+ /set_scale {
+ dup 1 exch div /InvScaleFactor exch def
+ dup scale
+ } bind def
+
+ % styles
+ /solid { [] 0 setdash } bind def
+ /dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+ /dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+ /invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+ /bold { 2 setlinewidth } bind def
+ /filled { } bind def
+ /unfilled { } bind def
+ /rounded { } bind def
+ /diagonals { } bind def
+
+ % hooks for setting color
+ /nodecolor { sethsbcolor } bind def
+ /edgecolor { sethsbcolor } bind def
+ /graphcolor { sethsbcolor } bind def
+ /nopcolor {pop pop pop} bind def
+
+ /beginpage { % i j npages
+ /npages exch def
+ /j exch def
+ /i exch def
+ /str 10 string def
+ npages 1 gt {
+ gsave
+ coordfont setfont
+ 0 0 moveto
+ (\() show i str cvs show (,) show j str cvs show (\)) show
+ grestore
+ } if
+ } bind def
+
+ /set_font {
+ findfont exch
+ scalefont setfont
+ } def
+
+ % draw aligned label in bounding box aligned to current point
+ /alignedtext { % width adj text
+ /text exch def
+ /adj exch def
+ /width exch def
+ gsave
+ width 0 gt {
+ text stringwidth pop adj mul 0 rmoveto
+ } if
+ [] 0 setdash
+ text show
+ grestore
+ } def
+
+ /boxprim { % xcorner ycorner xsize ysize
+ 4 2 roll
+ moveto
+ 2 copy
+ exch 0 rlineto
+ 0 exch rlineto
+ pop neg 0 rlineto
+ closepath
+ } bind def
+
+ /ellipse_path {
+ /ry exch def
+ /rx exch def
+ /y exch def
+ /x exch def
+ matrix currentmatrix
+ newpath
+ x y translate
+ rx ry scale
+ 0 0 1 0 360 arc
+ setmatrix
+ } bind def
+
+ /endpage { showpage } bind def
+ /showpage { } def
+
+ /layercolorseq
+ [ % layer color sequence - darkest to lightest
+ [0 0 0]
+ [.2 .8 .8]
+ [.4 .8 .8]
+ [.6 .8 .8]
+ [.8 .8 .8]
+ ]
+ def
+
+ /layerlen layercolorseq length def
+
+ /setlayer {/maxlayer exch def /curlayer exch def
+ layercolorseq curlayer 1 sub layerlen mod get
+ aload pop sethsbcolor
+ /nodecolor {nopcolor} def
+ /edgecolor {nopcolor} def
+ /graphcolor {nopcolor} def
+ } bind def
+
+ /onlayer { curlayer ne {invis} if } def
+
+ /onlayers {
+ /myupper exch def
+ /mylower exch def
+ curlayer mylower lt
+ curlayer myupper gt
+ or
+ {invis} if
+ } def
+
+ /curlayer 0 def
+
+ %%EndResource
+ %%EndProlog
+ %%BeginSetup
+ 14 default-font-family set_font
+ 1 setmiterlimit
+ % /arrowlength 10 def
+ % /arrowwidth 5 def
+
+ % make sure pdfmark is harmless for PS-interpreters other than Distiller
+ /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+ % make '<<' and '>>' safe on PS Level 1 devices
+ /languagelevel where {pop languagelevel}{1} ifelse
+ 2 lt {
+ userdict (<<) cvn ([) cvn load put
+ userdict (>>) cvn ([) cvn load put
+ } if
+
+ %%EndSetup
+ %%Page: 1 1
+ %%PageBoundingBox: 36 36 409 496
+ %%PageOrientation: Portrait
+ gsave
+ 36 36 373 460 boxprim clip newpath
+ 36 36 translate
+ 0 0 1 beginpage
+ 1.0000 set_scale
+ 4 4 translate 0 rotate
+ 0.000 0.000 1.000 graphcolor
+ 0.000 0.000 1.000 graphcolor
+ newpath -6 -6 moveto
+ -6 458 lineto
+ 371 458 lineto
+ 371 -6 lineto
+ closepath
+ fill
+ 0.000 0.000 1.000 graphcolor
+ newpath -6 -6 moveto
+ -6 458 lineto
+ 371 458 lineto
+ 371 -6 lineto
+ closepath
+ stroke
+ 0.000 0.000 0.000 graphcolor
+ 14.00 /Times-Roman set_font
+ % Node0x85fdea8
+ gsave 10 dict begin
+ newpath 189 404 moveto
+ 288 404 lineto
+ 288 452 lineto
+ 189 452 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 197 435 moveto
+ (if \(t % 2 == 0\))
+ [3.84 4.56 3.6 4.56 3.84 3.6 11.76 3.6 6.96 3.6 7.92 7.92 3.6 6.96 4.56]
+ xshow
+ end grestore
+ newpath 189 428 moveto
+ 288 428 lineto
+ stroke
+ gsave 10 dict begin
+ 214 411 moveto 9.0 -0.5 (T) alignedtext
+ end grestore
+ newpath 239 404 moveto
+ 239 428 lineto
+ stroke
+ gsave 10 dict begin
+ 263 411 moveto 8.0 -0.5 (F) alignedtext
+ end grestore
+ end grestore
+ % Node0x85fe1a8
+ gsave 10 dict begin
+ newpath 109 332 moveto
+ 231 332 lineto
+ 231 368 lineto
+ 109 368 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 117 345 moveto
+ (print\(t, " is even"\);)
+ [6.96 5.04 3.84 6.96 3.84 4.56 3.84 3.6 3.6 5.76 3.6 3.84 5.52 3.6 5.76 6.48 6.24 6.96 5.76 4.56 3.84]
+ xshow
+ end grestore
+ end grestore
+ % Node0x85fdea8->Node0x85fe1a8
+ newpath 205 404 moveto
+ 200 396 193 386 187 377 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 190 375 moveto
+ 182 368 lineto
+ 184 378 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 190 375 moveto
+ 182 368 lineto
+ 184 378 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85fe268
+ gsave 10 dict begin
+ newpath 249 332 moveto
+ 366 332 lineto
+ 366 368 lineto
+ 249 368 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 256 345 moveto
+ (print\(t, " is odd"\);)
+ [6.96 5.04 3.84 6.96 3.84 4.56 3.84 3.6 3.6 5.76 3.6 3.84 5.52 3.6 6.96 6.96 6.96 5.76 4.56 3.84]
+ xshow
+ end grestore
+ end grestore
+ % Node0x85fdea8->Node0x85fe268
+ newpath 272 404 moveto
+ 277 396 284 386 290 377 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 293 378 moveto
+ 295 368 lineto
+ 287 375 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 293 378 moveto
+ 295 368 lineto
+ 287 375 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85fe710
+ gsave 10 dict begin
+ newpath 182 232 moveto
+ 295 232 lineto
+ 295 296 lineto
+ 182 296 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 190 279 moveto
+ (int i = phi\(0, inc\))
+ [3.84 6.96 3.84 3.6 3.84 3.6 7.92 3.6 6.96 6.96 3.84 4.56 6.96 3.6 3.6 3.84 6.96 6.24 4.56]
+ xshow
+ 190 263 moveto
+ (if \(i < t\))
+ [3.84 4.56 3.6 4.56 3.84 3.6 7.92 3.6 3.84 4.56]
+ xshow
+ end grestore
+ newpath 182 256 moveto
+ 295 256 lineto
+ stroke
+ gsave 10 dict begin
+ 210 239 moveto 9.0 -0.5 (T) alignedtext
+ end grestore
+ newpath 239 232 moveto
+ 239 256 lineto
+ stroke
+ gsave 10 dict begin
+ 267 239 moveto 8.0 -0.5 (F) alignedtext
+ end grestore
+ end grestore
+ % Node0x85fe1a8->Node0x85fe710
+ newpath 184 332 moveto
+ 190 324 198 314 207 304 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 210 306 moveto
+ 213 296 lineto
+ 204 302 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 210 306 moveto
+ 213 296 lineto
+ 204 302 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85fe268->Node0x85fe710
+ newpath 292 332 moveto
+ 286 324 278 314 269 304 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 272 302 moveto
+ 263 296 lineto
+ 266 306 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 272 302 moveto
+ 263 296 lineto
+ 266 306 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85fecd0
+ gsave 10 dict begin
+ newpath 124 148 moveto
+ 211 148 lineto
+ 211 196 lineto
+ 124 196 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 132 179 moveto
+ (if \(i * i == t\))
+ [3.84 4.56 3.6 4.56 3.84 3.6 6.96 3.6 3.84 3.6 7.92 7.92 3.6 3.84 4.56]
+ xshow
+ end grestore
+ newpath 124 172 moveto
+ 211 172 lineto
+ stroke
+ gsave 10 dict begin
+ 146 155 moveto 9.0 -0.5 (T) alignedtext
+ end grestore
+ newpath 168 148 moveto
+ 168 172 lineto
+ stroke
+ gsave 10 dict begin
+ 189 155 moveto 8.0 -0.5 (F) alignedtext
+ end grestore
+ end grestore
+ % Node0x85fe710->Node0x85fecd0
+ newpath 203 232 moveto
+ 198 224 192 214 186 205 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 189 203 moveto
+ 181 196 lineto
+ 183 206 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 189 203 moveto
+ 181 196 lineto
+ 183 206 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85fe7d0
+ gsave 10 dict begin
+ newpath 266 154 moveto
+ 320 154 lineto
+ 320 190 lineto
+ 266 190 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 274 167 moveto
+ (return;)
+ [4.8 6 3.84 6.96 5.04 6.96 3.84]
+ xshow
+ end grestore
+ end grestore
+ % Node0x85fe710->Node0x85fe7d0
+ newpath 272 232 moveto
+ 275 223 279 211 283 200 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 287 201 moveto
+ 287 190 lineto
+ 280 198 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 287 201 moveto
+ 287 190 lineto
+ 280 198 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85feb98
+ gsave 10 dict begin
+ newpath 0 72 moveto
+ 173 72 lineto
+ 173 112 lineto
+ 0 112 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 8 95 moveto
+ (print\(t, " is ", i, " squared"\);)
+ [6.96 5.04 3.84 6.96 3.84 4.56 3.84 3.6 3.6 5.76 3.6 3.84 5.52 3.6 5.76 3.6 3.6 3.84 3.6 3.6 5.76 3.6 5.52 6.72 6.96 6.24 4.8 6.24 6.96 5.76 4.56 3.84]
+ xshow
+ 8 79 moveto
+ (break;)
+ [6.96 4.8 6.24 6.24 6.96 3.84]
+ xshow
+ end grestore
+ end grestore
+ % Node0x85fecd0->Node0x85feb98
+ newpath 134 148 moveto
+ 127 140 118 130 110 120 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 112 117 moveto
+ 103 112 lineto
+ 107 122 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 112 117 moveto
+ 103 112 lineto
+ 107 122 lineto
+ closepath
+ stroke
+ end grestore
+ % NodeX
+ gsave 10 dict begin
+ newpath 151 0 moveto
+ 249 0 lineto
+ 249 36 lineto
+ 151 36 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 159 13 moveto
+ (int inc = i + 1;)
+ [3.84 6.96 3.84 3.6 3.84 6.96 6.24 3.6 7.92 3.6 3.84 3.6 7.92 3.6 6.96 3.84]
+ xshow
+ end grestore
+ end grestore
+ % Node0x85fecd0->NodeX
+ newpath 190 148 moveto
+ 192 125 195 77 198 46 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 201 46 moveto
+ 199 36 lineto
+ 195 46 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 201 46 moveto
+ 199 36 lineto
+ 195 46 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85feb98->NodeX
+ newpath 117 72 moveto
+ 131 63 148 52 163 42 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 166 44 moveto
+ 172 36 lineto
+ 162 39 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 166 44 moveto
+ 172 36 lineto
+ 162 39 lineto
+ closepath
+ stroke
+ end grestore
+ % NodeX->Node0x85fe710
+ newpath 203 36 moveto
+ 209 75 223 167 231 222 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 228 223 moveto
+ 233 232 lineto
+ 234 222 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 228 223 moveto
+ 233 232 lineto
+ 234 222 lineto
+ closepath
+ stroke
+ end grestore
+ endpage
+ showpage
+ grestore
+ %%PageTrailer
+ %%EndPage: 1
+ %%Trailer
+ %%Pages: 1
+ end
+ restore
+ %%EOF
+
+ %%EndDocument
+ @endspecial 324 4697 a Fh(1.4)135 b(LL)-15 b(VM)44 b(In)l(termediate)j
+ (Represen)l(tation)324 4882 y Fi(LL)-11 b(VM)33 b(sp)s(orts)h(an)f
+ (instruction)h(set)g(arc)m(hitecture)g(with)g(explicit)h(basic)f(blo)s
+ (c)m(ks,)g(SSA)324 5002 y(form)28 b(and)h(34)f(instructions)i(in)e(six)
+ i(categories.)43 b(It)28 b(features)i(an)e(explicit)i(con)m(trol)f
+ (\015o)m(w)1918 5251 y(4)p eop end
+ %%Page: 5 5
+ TeXDict begin 5 4 bop 671 533 a Fj(T)m(yp)s(e)p 980 569
+ 4 121 v 257 w(Description)p 1936 569 V 262 w(T)m(yp)s(e)p
+ 2317 569 V 262 w(Description)p 611 572 2665 4 v 753 656
+ a Fi(v)m(oid)p 980 692 4 121 v 100 w(No)33 b(v)-5 b(alue)p
+ 1936 692 V 2317 692 V 611 696 2665 4 v 748 780 a(b)s(o)s(ol)p
+ 980 816 4 121 v 98 w(T)d(rue)34 b(or)e(V)-8 b(alue)p
+ 1936 816 V 2317 816 V 611 819 2665 4 v 693 904 a(ub)m(yte)p
+ 980 940 4 121 v 101 w(Unsigned)34 b(b)m(yte)p 1936 940
+ V 406 w(sb)m(yte)p 2317 940 V 102 w(Signed)f(b)m(yte)p
+ 611 943 2665 4 v 660 1027 a(ushort)p 980 1064 4 121 v
+ 100 w(Unsigned)h(16)e(bits)p 1936 1064 V 308 w(short)p
+ 2317 1064 V 100 w(Signed)h(16)f(bits)p 611 1067 2665
+ 4 v 761 1151 a(uin)m(t)p 980 1187 4 121 v 100 w(Unsigned)i(32)e(bits)p
+ 1936 1187 V 409 w(in)m(t)p 2317 1187 V 100 w(Signed)h(32)f(bits)p
+ 611 1191 2665 4 v 699 1275 a(ulong)p 980 1311 4 121 v
+ 99 w(Unsigned)i(64)e(bits)p 1936 1311 V 346 w(long)p
+ 2317 1311 V 100 w(Signed)h(64)f(bits)p 611 1314 2665
+ 4 v 742 1399 a(\015oat)p 980 1435 4 121 v 99 w(32-bit)g(\015oating)h(p)
+ s(oin)m(t)p 1936 1435 V 99 w(double)p 2317 1435 V 101
+ w(64-bit)f(\015oating)g(p)s(oin)m(t)p 611 1438 2665 4
+ v 729 1522 a(lab)s(el)p 980 1558 4 121 v 99 w(Branc)m(h)i(destination)p
+ 1936 1558 V 2317 1558 V 1142 1719 a(T)-8 b(able)33 b(1:)43
+ b(Primitiv)m(e)35 b(t)m(yp)s(es)f(in)f(LL)-11 b(VM)33
+ b(IR)324 1998 y(graph,)52 b(language-indep)s(enden)m(t)f(t)m(yp)s(e)e
+ (information)g(and)f(explicit)i(t)m(yp)s(ed)g(p)s(oin)m(ter)324
+ 2119 y(arithmetic.)41 b(It)21 b(has)i(an)e(in\014nite)i(n)m(um)m(b)s
+ (er)g(of)e(registers)i(and)f(explicit)h(memory)g(op)s(erations.[ALB)
+ 3928 2082 y Fe(+)3988 2119 y Fi(03)o(,)324 2239 y(LA04b])470
+ 2359 y(There)46 b(are)e(13)g(primitiv)m(e)j(t)m(yp)s(es)f(sho)m(wn)f
+ (in)g(T)-8 b(able)45 b(1)g(from)f(whic)m(h)i(comp)s(ound)324
+ 2480 y(t)m(yp)s(es)35 b(ma)m(y)f(b)s(e)f(deriv)m(ed.)48
+ b(These)35 b(deriv)m(ed)h(t)m(yp)s(es)e(ma)m(y)g(b)s(e)g(arra)m(ys,)g
+ (suc)m(h)h(as)f Fg([3)52 b(x)f([4)324 2600 y(x)g(int]])p
+ Fi(,)41 b(a)c(p)s(oin)m(ter)h(t)m(yp)s(e)g Fg(float*)p
+ Fi(,)j(a)c(structure)i Fd(f)p Fg(int,)52 b(float,)h([3)f(x)f(sbyte])p
+ Fd(g)324 2721 y Fi(or)38 b(a)g(function)h Fg(void)52
+ b(\(int\)*)40 b Fi(b)s(eing)f(a)f(p)s(oin)m(ter)g(to)g(a)g(function)h
+ (that)f(returns)i(v)m(oid)324 2841 y(and)32 b(tak)m(es)i(a)f(signed)g
+ (32-bit)f(in)m(teger.[Lat06])470 2961 y(The)25 b(registers)g(in)f(LL)
+ -11 b(VM)24 b(are)g(SSA)h(v)-5 b(ariables,)26 b(and)e(their)g(iden)m
+ (ti\014ers)i(are)e(pre\014xed)324 3082 y(with)39 b(\\\045".)62
+ b(V)-8 b(ariables)40 b(are)e(declared)i(b)m(y)g(the)f(statemen)m(t)h
+ (that)f(de\014nes)h(them.)63 b(All)324 3202 y(instructions)47
+ b(in)f(LL)-11 b(VM)46 b(are)f(strongly)i(t)m(yp)s(ed,)j(with)c(the)g(t)
+ m(yp)s(e)g(of)f(its)h(argumen)m(ts)324 3322 y(app)s(earing)36
+ b(b)s(efore)g(the)h(argumen)m(t.)55 b(In)36 b(the)h(ev)m(en)m(t)h(that)
+ e(the)h(t)m(w)m(o)g(argumen)m(ts)g(of)f(an)324 3443 y(binary)f(op)s
+ (eration)g(are)g(the)h(same,)g(the)g(t)m(yp)s(e)f(is)h(only)f(sp)s
+ (eci\014ed)i(once,)g(immediately)324 3563 y(after)32
+ b(the)h(op)s(co)s(de.)44 b(A)32 b(sample)i(instruction)g(is)f
+ Fg(\045result)53 b(=)e(mul)i(uint)f(\045X,)g(8)p Fi(.)470
+ 3684 y(Throughout)33 b(this)g(pap)s(er,)g(I)g(will)g(refer)g(to)f
+ (certain)h(instructions:)340 3879 y(load)49 b Fg(\045y)i(=)h(load)g
+ Fb(type)19 b Fg(*)51 b(\045x)p Fi(.)568 3999 y(Dereferences)34
+ b(the)f(p)s(oin)m(ter)g Fg(x)g Fi(and)g(loads)f(the)h(v)-5
+ b(alue)33 b(in)m(to)g(register)h Fg(y)p Fi(.)312 4200
+ y(store)50 b Fg(store)i Fb(type)70 b Fg(\045x,)52 b Fb(type)19
+ b Fg(*)51 b(\045y)p Fi(.)568 4320 y(Stores)35 b(the)g(v)-5
+ b(alue)36 b(in)f(register)g Fg(x)g Fi(in)m(to)g(the)h(memory)f
+ (referred)h(to)e(b)m(y)k Fg(y)p Fi(.)50 b(In)35 b(C,)568
+ 4440 y(this)e(w)m(ould)g(b)s(e)g Fg(*y)52 b(=)g(x;)p
+ Fi(.)-69 4641 y(getelemen)m(tptr)f Fg(\045y)g(=)h(getelementptr)j
+ Fb(type)18 b Fg(*)52 b(\045x,)g(long)g(0,)g(long)g(0)568
+ 4761 y Fi(\\getelemen)m(tptr")37 b(ma)m(y)f(b)s(e)g(used)h(as)e(an)h
+ (instruction)g(de\014ning)h(a)e(v)-5 b(ariable,)37 b(or)568
+ 4882 y(inline)e(as)f(an)g(expression)i(in)e(a)g(another)g(op)s
+ (eration.)48 b(In)34 b(either)h(case,)g(\\getele-)568
+ 5002 y(men)m(tptr")k(is)g(v)-5 b(ariadic,)41 b(meaning)e(that)g(is)g
+ (ma)m(y)h(ha)m(v)m(e)g(an)m(y)f(n)m(um)m(b)s(er)h(of)e(argu-)1918
+ 5251 y(5)p eop end
+ %%Page: 6 6
+ TeXDict begin 6 5 bop 568 548 a Fi(men)m(ts.)70 b(The)42
+ b(\014rst)g(argumen)m(t)g(is)g(alw)m(a)m(ys)g(a)f(base)h(p)s(oin)m
+ (ter,)i(follo)m(w)m(ed)e(b)m(y)g(the)568 668 y(indices)34
+ b(in)f(the)g(new)g(p)s(oin)m(ter)g(b)s(eing)g(calculated.)568
+ 826 y(This)f(is)g(an)f(esp)s(ecially)j(in)m(teresting)f(instruction)f
+ (b)s(ecause)h(it)e(allo)m(ws)h(the)g(t)m(yp)s(e-)568
+ 947 y(safe)h(subset)h(of)e(p)s(oin)m(ter)h(arithmetic.)-66
+ 1143 y(mallo)s(c,)f(allo)s(ca)49 b Fg(\045x)i(=)h(alloca)h
+ Fb(type)568 1263 y Fg(\045x)e(=)h(malloc)h Fb(type)568
+ 1384 y Fi(Both)38 b(heap)h(and)f(stac)m(k)i(allo)s(cation)d(\(mallo)s
+ (c)i(and)f(allo)s(ca)g(resp)s(ectiv)m(ely\))j(ha)m(v)m(e)568
+ 1504 y(their)31 b(o)m(wn)h(op)s(co)s(des,)f(and)g(tak)m(e)h(the)f(same)
+ h(argumen)m(ts:)44 b(one)31 b(t)m(yp)s(e,)h(optionally)568
+ 1624 y(follo)m(w)m(ed)h(b)m(y)h(a)e(coun)m(t,)h(optionally)g(follo)m(w)
+ m(ed)h(b)m(y)g(an)e(alignmen)m(t.)364 1820 y(free)50
+ b Fg(free)i Fb(type)70 b Fg(\045x)568 1941 y Fi(F)-8
+ b(rees)33 b(memory)g(allo)s(cated)g(with)g(the)g Fg(malloc)h
+ Fi(instruction.)427 2137 y(br)49 b Fg(br)i(label)i(\045loopexit)568
+ 2257 y(br)e(bool)i(\045condition)h(label)e(\045else)h(label)g(\045then)
+ 568 2377 y Fi(A)32 b(branc)m(h)i(statemen)m(t,)g(with)f(an)g(optional)f
+ (conditional.)470 2559 y(T)-8 b(ak)m(en)28 b(directly)g(from)f(LL)-11
+ b(VM's)27 b(C)g(fron)m(t)g(end,)h(a)f(small)g(complete)h(program)e(lo)s
+ (oks)324 2679 y(lik)m(e:)324 2877 y Fg(\045y)52 b(=)f(global)i(sbyte*)g
+ (\045x)564 b(;)52 b()h([#uses=1])324 2998 y(\045x)f(=)f(weak)h
+ (global)h(sbyte)g(0)820 b(;)52 b()h([#uses=1])324
+ 3118 y(\045.str_1)g(=)e(internal)j(constant)f([6)f(x)g(sbyte])g
+ (c"abcde\\00")670 b(;)51 b(<[6)h(x)g(sbyte]*>)h([#uses=0])324
+ 3359 y(implementation)157 b(;)52 b(Functions:)324 3600
+ y(void)g(\045f\(\))g({)324 3720 y(entry:)734 3840 y(\045tmp.0)h(=)e
+ (load)i(sbyte**)g(\045y)821 b(;)51 b()i([#uses=1])734
+ 3961 y(store)g(sbyte)f(100,)g(sbyte*)h(\045tmp.0)734
+ 4081 y(ret)f(void)324 4202 y(})470 4400 y Fi(The)36 b(global)e(v)-5
+ b(ariables)36 b(b)s(egin)f(a)g(program,)g(follo)m(w)m(ed)h(b)m(y)g(the)
+ f(w)m(ord)g(\\implemen-)324 4521 y(tation",)c(then)g(the)h(functions.)
+ 44 b(Note)31 b(that)g(the)g(lab)s(el)h(\\en)m(try")f(is)h(mandatory;)g
+ (there)324 4641 y(is)d(a)f(lab)s(el)h(at)f(the)h(b)s(eginning)g(of)f
+ (ev)m(ery)i(basic)f(blo)s(c)m(k.)43 b(The)30 b Fg(;)51
+ b(text)30 b Fi(indicates)g(a)e(com-)324 4761 y(men)m(t)k(running)g(to)e
+ (the)i(end)g(of)e(the)i(line.)43 b(F)-8 b(or)31 b(the)g(most)h(part,)f
+ (the)h(LL)-11 b(VM)31 b(assem)m(bly)324 4882 y(language)44
+ b(is)h(self-explanatory)-8 b(,)48 b(but)d(for)e(comprehensiv)m(e)48
+ b(details,)g(please)e(consult)324 5002 y(the)33 b(language)f
+ (reference.[Lat06)q(].)1918 5251 y(6)p eop end
+ %%Page: 7 7
+ TeXDict begin 7 6 bop 324 548 a Fk(2)161 b(Related)53
+ b(W)-13 b(ork)324 767 y Fi(The)22 b(design)h(of)e(the)i(c)m(hec)m(k)m
+ (er)h(w)m(as)f(hea)m(vily)g(in\015uenced)h(b)m(y)f(t)m(w)m(o)f(pro)5
+ b(jects,)25 b(V)-8 b(algrind[SN)q(])324 887 y(and)32
+ b(Co)m(v)m(erit)m(y)-8 b(.)470 1008 y(V)g(algrind)39
+ b(is)g(a)f(dynamic)i(memory)g(error)e(detector.)62 b(It)39
+ b(w)m(orks)h(b)m(y)f(in)m(terpreting)324 1128 y(compiled)33
+ b(x86)g(programs)f(and)h(JIT)g(compiling)g(them)g(in)m(to)g(a)f
+ (reduced)i(SP)-8 b(AR)m(C-lik)m(e)324 1249 y(assem)m(bly)g(,)42
+ b(where)d(it)f(instrumen)m(ts)i(the)f(co)s(de,)h(and)e(JITs)h(it)f(bac)
+ m(k)h(in)m(to)g(x86)f(for)f(ex-)324 1369 y(ecution.)60
+ b(In)38 b(the)g(instrumen)m(tation)h(phase,)h(mo)s(di\014es)f(the)f(co)
+ s(de)g(to)f(store)i(an)e(extra)324 1489 y(\\v)-5 b(alidit)m(y")39
+ b(b)m(yte)h(for)e(eac)m(h)h(b)m(yte)h(of)f(register)g(data)f(or)h
+ (memory)-8 b(,)41 b(and)e(an)f(extra)h(ad-)324 1610 y(dressabilit)m(y)e
+ (bit)e(for)f(eac)m(h)i(b)m(yte)g(of)e(allo)s(cated)g(memory)-8
+ b(.)51 b(The)36 b(v)-5 b(alidit)m(y)36 b(bits)f(are)g(set)324
+ 1730 y(when)f(they)h(are)e(assigned)i(with)f(a)f(\\v)-5
+ b(alid")33 b(v)-5 b(alue)34 b(\(a)f(source)i(with)f(the)g(v)-5
+ b(alidit)m(y)34 b(bits)324 1850 y(set\))28 b(and)g(cleared)h(when)g
+ (assigned)h(from)d(a)h(source)h(with)g(the)f(bits)h(cleared.)42
+ b(The)29 b(\\ad-)324 1971 y(dressabilit)m(y")j(bit)e(stores)h(whether)h
+ (a)e(giv)m(en)h(address)g(can)g(b)s(e)f(dereferenced;)j(it)d(is)h(set)
+ 324 2091 y(on)23 b(mallo)s(c)h(and)g(cleared)g(on)g(free.)41
+ b(V)-8 b(algrind)24 b(will)g(in)m(tercept)h(the)f(trap)g(to)f(Lin)m(ux)
+ i(k)m(ernel)324 2212 y(and)k(v)m(erify)i(that)e(the)g(argumen)m(ts)h
+ (are)g(all)f(v)-5 b(alid)29 b(or)g(addressable,)j(as)d(appropriate)g
+ (for)324 2332 y(the)37 b(giv)m(en)g(system)h(call.)55
+ b(It)37 b(also)f(tests)h(the)g(v)-5 b(alidit)m(y)37 b(bits)g(on)g
+ (branc)m(h)g(instructions.)324 2452 y(In)29 b(V)-8 b(algrind,)31
+ b(it)e(is)h(acceptable)g(to)f(cop)m(y)i(around)e(unde\014ned)i(data.)42
+ b(An)30 b(error)f(is)h(only)324 2573 y(thro)m(wn)39 b(when)h(the)g(b)s
+ (eha)m(viour)g(of)e(the)h(program)g(is)g(determined)i(b)m(y)f(an)f
+ (unde\014ned)324 2693 y(v)-5 b(alue.)470 2813 y(Co)m(v)m(erit)m(y's)34
+ b(c)m(hec)m(k)m(er)g(is)e(deriv)m(ed)g(and)g(rewritten)g(from)f(their)g
+ (earlier)h(w)m(ork,)g(Stan-)324 2934 y(ford)22 b(GCC[ECCH00)r(].)40
+ b(This)24 b(is)f(a)f(static)h(c)m(hec)m(k)m(er)j(built)d(in)g(to)f(a)h
+ (compiler)g(framew)m(ork,)324 3054 y(using)i(a)g(language)f(called)i
+ (\\metal")f(to)f(describ)s(e)j(in)m(v)-5 b(alid)25 b(op)s(erations,)i
+ (suc)m(h)f(as)f(double)324 3175 y(calls)33 b(to)f(a)h(lo)s(c)m(king)g
+ (function,)g(in)g(terms)g(of)g(the)g(primitiv)m(es)h(in)f(the)g(target)
+ f(program.)470 3295 y(Chec)m(k)m(er)38 b(is)d(directly)i(built)e(on)g
+ (top)g(of)f(a)h(compiler)h(framew)m(ork,)g(the)g(Lo)m(w)f(Lev)m(el)324
+ 3415 y(Virtual)23 b(Mac)m(hine[LA04a)q(].)40 b(LL)-11
+ b(VM)24 b(is)f(particularly)h(w)m(ell)g(suited)g(for)e(dev)m(eloping)j
+ (new)324 3536 y(mid-lev)m(el)38 b(language-indep)s(enden)m(t)g(in)m
+ (terpro)s(cedural)g(analysis)g(and)f(optimizations.)324
+ 3656 y(It)28 b(also)f(pro)m(vides)j(a)d(t)m(yp)s(e-safe)i(b)m(yteco)s
+ (de)g(language)e(with)i(JITter,)g(alongside)g(a)e(static)324
+ 3777 y(compiler.)44 b(This)34 b(compilation)f(strategy)g(allo)m(ws)h
+ (for)e(link)h(time)g(optimization.)470 3897 y(The)i(applicabilit)m(y)g
+ (of)e(LL)-11 b(VM)35 b(to)e(co)s(de)h(c)m(hec)m(king)i(w)m(as)f(not)e
+ (lost)h(on)g(its)g(authors.)324 4017 y(SAFEcore[DKAL05])i(is)h(a)f(pro)
+ 5 b(ject)38 b(with)f(similar)g(goals,)h(but)e(a)h(more)f(formal)g(and)
+ 324 4138 y(rigorous)25 b(design.)42 b(Their)25 b(pro)s(cedure)h(marks)g
+ (all)f(p)s(oten)m(tially)h(in)m(v)-5 b(alid)25 b(b)s(eha)m(viour)h
+ (with)324 4258 y(run-time)40 b(c)m(hec)m(ks,)k(then)c(applies)h(static)
+ f(optimization)g(to)f(eliminate)i(the)f(need)g(for)324
+ 4378 y(the)33 b(run-time)g(c)m(hec)m(ks.[DKA05)r(])1918
+ 5251 y(7)p eop end
+ %%Page: 8 8
+ TeXDict begin 8 7 bop 324 548 a Fk(3)161 b(The)53 b(Chec)l(k)l(er)324
+ 767 y Fi(The)37 b(program)f(c)m(hec)m(k)m(er)j(do)s(esn't)e(directly)g
+ (v)m(erify)h(C)f(or)e(C++)i(seman)m(tics.)56 b(Instead,)324
+ 887 y(w)m(e)36 b(rely)f(on)g(the)g(LL)-11 b(VM)36 b(GCC)f(fron)m(t)g
+ (end)g(to)g(compile)h(a)e(program)h(in)m(to)g(the)g(LL)-11
+ b(VM)324 1008 y(in)m(termediate)39 b(represen)m(tation,)i(whic)m(h)e
+ (is)f(then)h(v)m(eri\014ed.)60 b(Similarly)-8 b(,)40
+ b(not)d(all)h(prop-)324 1128 y(erties)d(of)e(a)g(program)h(are)f(v)m
+ (eri\014ed)j(b)m(y)f(the)f(c)m(hec)m(k)m(er;)j(LL)-11
+ b(VM)34 b(includes)i(an)e(extensiv)m(e)324 1249 y(mo)s(dule)k(v)m
+ (eri\014er)h(whic)m(h)h(guaran)m(tees)f(that)e(all)h(of)f(the)h(LL)-11
+ b(VM)38 b(language)g(assertions)324 1369 y(are)32 b(held)i(b)s(efore)e
+ (the)h(c)m(hec)m(k)m(er)j(op)s(erates)d(up)s(on)f(it.)470
+ 1489 y(Correct)45 b(op)s(eration)e(of)h(the)g(c)m(hec)m(k)m(er)j(also)d
+ (relies)h(on)f(the)g(strength)h(of)f(LL)-11 b(VMs)324
+ 1610 y(optimizers)37 b(ha)m(ving)g(b)s(een)g(applied)f(on)g(the)h
+ (input.)54 b(There)37 b(is)g(no)f(attempt)g(made)g(in)324
+ 1730 y(the)h(c)m(hec)m(k)m(er)i(to)d(simplify)h(expressions)j(or)35
+ b(detect)j(dead)f(co)s(de)f(paths.)55 b(The)38 b(c)m(hec)m(k)m(er)324
+ 1850 y(will)33 b(generate)g(spurious)h(errors)f(if)f(the)h(optimizers)h
+ (ha)m(v)m(e)g(not)f(b)s(een)g(run.)470 1971 y(There)f(are)g(t)m(w)m(o)f
+ (ma)5 b(jor)32 b(categories)f(of)g(errors,)h(v)-5 b(alidit)m(y)32
+ b(errors)g(referring)f(to)g(non-)324 2091 y(deterministic)k(b)s(eha)m
+ (viour,)e(and)g(addressabilit)m(y)i(errors)e(b)s(eing)g(memory)g
+ (faults.)324 2380 y Fh(3.1)135 b(V)-11 b(alidit)l(y)324
+ 2565 y Fi(The)39 b(LL)-11 b(VM)39 b(IR)g(includes)h(an)e(in)m
+ (teresting)i(constan)m(t)g(v)-5 b(alue,)40 b Fg(undef)g
+ Fi(or)e(\\unde\014ned)324 2685 y(v)-5 b(alue")42 b(whic)m(h)i(used)f
+ (whenev)m(er)h(the)f(programs)f(b)s(eha)m(viour)h(is)g(v)-5
+ b(alid)42 b(regardless)h(of)324 2805 y(the)38 b(v)-5
+ b(alue.)60 b(In)38 b(practise,)j(it)c(is)i(found)f(whenev)m(er)i(LL)-11
+ b(VM's)39 b(optimizers)h(\014nd)e(a)g(case)324 2926 y(where)c(the)f(v)
+ -5 b(alue)33 b(is)g(uninitialized,)h(but)f(not)f(when)i(it)f(is)g
+ (indeterminate.)470 3046 y(Nondeterministic)42 b(b)s(eha)m(viour)e(o)s
+ (ccurs)g(whenev)m(er)i(an)d(unde\014ned)i(v)-5 b(alue)40
+ b(a\013ects)324 3166 y(the)e(con)m(trol)h(\015o)m(w)f(of)g(the)h
+ (program.)59 b(Since)40 b(all)e(instructions)h(whic)m(h)h(a\013ect)e
+ (con)m(trol)324 3287 y(\015o)m(w)27 b(are)f(en)m(umerated)j(as)e(branc)
+ m(h)g(instructions,)i(w)m(e)f(en)m(umerate)g(all)f(branc)m(h)g
+ (instruc-)324 3407 y(tions)33 b(and)f(detect)i(branc)m(hes)g(on)f
+ Fg(undef)h Fi(argumen)m(t.)469 3634 y Fd(\017)49 b Fg(branch)k(on)e
+ (undef)i(found.)568 3754 y Fi(An)38 b(v)-5 b(ariable)38
+ b(of)f(unde\014ned)j(v)-5 b(alue)38 b(will)g(a\013ect)g(the)g(con)m
+ (trol)g(\015o)m(w)h(of)e(the)h(pro-)568 3875 y(gram,)28
+ b(leading)g(to)g(results)h(that)e(are)h(not)f(determined)j(b)m(y)f(the)
+ f(program)f(input.)568 4036 y(Example:)568 4280 y Fg(extern)53
+ b(void)f(print\(char*\);)568 4521 y(void)g(f\(\))568
+ 4641 y({)670 4761 y(int)g(x;)670 4882 y(if)g(\(x\))773
+ 5002 y(print\("foo"\);)1918 5251 y Fi(8)p eop end
+ %%Page: 9 9
+ TeXDict begin 9 8 bop 568 548 a Fg(})469 793 y Fd(\017)49
+ b Fg(switch)k(on)e(undef)i(found.)568 913 y Fi(Similarly)c(to)e(branc)m
+ (hes,)54 b(c)m(hec)m(k)m(er)d(also)d(\014nds)h(non-determinism)h(in)e
+ (switc)m(h)568 1034 y(statemen)m(ts.)568 1196 y(Example:)568
+ 1440 y Fg(extern)53 b(void)f(print\(char*\);)568 1561
+ y(static)h(const)f(int)g(x[2][3])h(=)f({{10,)g(11,)h(12},)f({13,)g(14,)
+ g(15}};)568 1802 y(void)g(f\(\))568 1922 y({)670 2042
+ y(int)g(*p)g(=)g(\(int*\)x;)670 2163 y(switch)h(\(p[6]\))670
+ 2283 y({)773 2403 y(case)f(0:)875 2524 y(print\("foo"\);)875
+ 2644 y(break;)773 2765 y(case)g(1:)875 2885 y(print\("bar"\);)875
+ 3005 y(break;)670 3126 y(})568 3246 y(})324 3535 y Fh(3.2)135
+ b(Addressabilit)l(y)324 3720 y Fi(Memory)39 b(accesses)h(concern)e
+ (either)h(reads,)h(writes,)g(or)d(calls)h(of)f(function)i(p)s(oin)m
+ (ters.)324 3840 y(Besides)32 b(c)m(hec)m(king)h(for)d
+ Fg(undef)i Fi(p)s(oin)m(ter)f(v)-5 b(alues,)32 b(c)m(hec)m(k)m(er)i
+ (\014nds)d(the)g(follo)m(wing)g(errors:)469 4068 y Fd(\017)49
+ b Fg(read/write/free)55 b(of)d(unallocated)i(memory.)568
+ 4189 y Fi(Chec)m(k)m(er)49 b(has)e(found)g(a)f(free)h(instruction)h
+ (whose)g(argumen)m(t)f(can)g(not)g(b)s(e)g(a)568 4309
+ y(p)s(oin)m(ter)35 b(to)g(allo)s(cated)g(memory)-8 b(.)52
+ b(Suc)m(h)37 b(an)e(instruction)h(is)g(alw)m(a)m(ys)g(in)g(error)f(if)
+ 568 4430 y(executed.)568 4591 y(Example:)568 4836 y Fg(#include)53
+ b()1918 5251 y Fi(9)p eop end
+ %%Page: 10 10
+ TeXDict begin 10 9 bop 568 548 a Fg(void)52 b(f\(\))g({)670
+ 668 y(char)h(*x)e(=)h(\(char*\))h('y';)670 789 y(free\(x\);)568
+ 909 y(})469 1131 y Fd(\017)c Fg(free)j(of)g(non-heap)h(memory.)568
+ 1251 y Fi(A)46 b(free)g(instruction)h(ma)m(y)g(only)g(free)f(memory)h
+ (allo)s(cated)f(with)h(the)g(mallo)s(c)568 1372 y(instruction,)33
+ b(not)g(with)g(allo)s(ca)f(nor)h(a)f(p)s(oin)m(ter)h(to)f(a)g(v)-5
+ b(ariable.)568 1530 y(Example:)568 1752 y Fg(#include)53
+ b()568 1993 y(void)f(f\(\))g({)670 2113 y(char)h(x;)670
+ 2233 y(char)g(*y)e(=)h(&x;)670 2354 y(free\(y\);)568
+ 2474 y(})469 2696 y Fd(\017)d Fg(write)j(to)g(constant)h(memory.)568
+ 2816 y Fi(In)45 b(C,)g(a)f(v)-5 b(ariable)45 b(declared)h
+ Fg(const)g Fi(ma)m(y)g(not)e(b)s(e)h(mo)s(di\014ed,)k(although)44
+ b(the)568 2936 y(compiler)24 b(will)h(not)e(stop)h(y)m(ou)g(if)g(y)m
+ (ou)g(tak)m(e)g(a)g(p)s(oin)m(ter)g(and)f(cast)h(a)m(w)m(a)m(y)h
+ (constness.)568 3095 y(Example:)568 3317 y Fg(void)52
+ b(f\(\))g({)670 3437 y(char)h(*x)e(=)h("String!";)670
+ 3557 y(x[0])h(=)e('s';)568 3678 y(})469 3900 y Fd(\017)e
+ Fg(write)j(to)g(function)h(pointer.)568 4020 y(read)f(from)g(function)i
+ (pointer.)568 4140 y Fi(The)47 b(p)s(oin)m(ter)g(b)s(eing)g(read)g(or)f
+ (written)i(is)f(kno)m(wn)h(to)e(b)s(e)h(the)g(address)h(of)e(a)568
+ 4261 y(function.)568 4419 y(Example:)568 4641 y Fg(char)52
+ b(f\(\))g({)670 4761 y(char)h(*F)e(=)h(f;)670 4882 y(return)h(*F;)568
+ 5002 y(})1894 5251 y Fi(10)p eop end
+ %%Page: 11 11
+ TeXDict begin 11 10 bop 469 548 a Fd(\017)49 b Fg(call)j(via)g
+ (non-function)j(pointer.)568 668 y Fi(The)34 b(input)g(co)s(de)f(tak)m
+ (es)h(a)f(p)s(oin)m(ter)h(to)f(a)g(v)-5 b(ariable)33
+ b(or)g(allo)s(cated)g(memory)h(and)568 789 y(then)j(casts)g(it)g(in)m
+ (to)f(a)h(function)g(p)s(oin)m(ter)g(and)f(tries)h(to)g(call)f(it.)55
+ b(In)37 b(some)h(rare)568 909 y(cases)j(this)f(ma)m(y)g(b)s(e)g(in)m
+ (ten)m(tional;)k(a)c(JITter)g(will)h(allo)s(cate)e(memory)i(to)e(emit)
+ 568 1029 y(target)27 b(instructions)j(for)d(execution.)44
+ b(Ho)m(w)m(ev)m(er,)31 b(it)d(is)h(unp)s(ortable)f(and)g(target-)568
+ 1150 y(sp)s(eci\014c,)40 b(and)d(the)g(b)s(eha)m(viour)h(is)g(not)f
+ (de\014ned)i(b)m(y)f(the)f(C)h(or)e(C++)i(language)568
+ 1270 y(standard.)568 1432 y(Example:)568 1677 y Fg(void)52
+ b(f\(\))g({)670 1797 y(char)h(x;)670 1918 y(char)g(*y)e(=)h(&x;)670
+ 2038 y(void)h(\(*F\)\(\))f(=)g(\(void\(*\)\(\)\))i(y;)670
+ 2159 y(F\(\);)568 2279 y(})470 2524 y Fi(None)23 b(of)f(these)h(errors)
+ g(rely)g(on)f(kno)m(wledge)i(of)e(the)h(t)m(yp)s(e)g(system,)k(so)22
+ b(the)h(errors)g(are)324 2644 y(found)i(at)f(the)h(p)s(oin)m(t)g(of)f
+ (memory)h(op)s(eration,)h(not)f(at)f(a)g(p)s(oten)m(tially)i(harmless)g
+ (casting)324 2765 y(instruction.)41 b(In)23 b(this)g(con)m(text,)j(the)
+ e(term)f(\\function")f(refers)i(to)e(the)h(functions)h(visible)324
+ 2885 y(at)32 b(link)h(time.)470 3005 y(All)39 b(of)g(the)g(examples)i
+ (compile)f(in)f(GCC)h(3.3)e(with)i(no)f(w)m(arnings,)j(ev)m(en)e(in)f
+ (full)324 3126 y(w)m(arnings)30 b(mo)s(de.)43 b(GCC)30
+ b(3.4)f(and)h(up)g(note)f(that)h(casting)g(b)s(et)m(w)m(een)h(function)
+ f(p)s(oin)m(ter)324 3246 y(t)m(yp)s(es)k(and)e(data)h(p)s(oin)m(ter)g
+ (t)m(yp)s(es)h(is)f(in)m(v)-5 b(alid.)324 3579 y Fk(4)161
+ b(T)-13 b(ec)l(hnical)52 b(No)l(v)l(elt)l(y)324 3798
+ y Fi(Chec)m(k)m(er's)26 b(most)d(in)m(teresting)h(w)m(ork)g(is)f
+ (handled)g(b)m(y)h(the)f(p)s(oin)m(ter)g(analysis)h(mec)m(hanism)324
+ 3918 y(to)35 b(follo)m(w)g(the)h(propagation)e(of)h(p)s(oin)m(ters)h
+ (through)f(the)h(program)f(\015o)m(w.)52 b(The)36 b(result)324
+ 4039 y(is)30 b(that)f(at)g(an)m(y)h(p)s(oin)m(t)g(in)g(the)g(program,)f
+ (c)m(hec)m(k)m(er)k(can)c(pro)s(duce)i(a)e(list)h(of)f(all)g(p)s
+ (ossible)324 4159 y(memory)44 b(regions)f(b)s(eing)g(aliased)g(\(a)f
+ (shorter)i(list)f(than)g(the)g(list)g(of)f(all)h(p)s(oin)m(ters\),)324
+ 4280 y(ev)m(en)34 b(in)f(a)f(t)m(yp)s(e-unsafe)i(program.)470
+ 4400 y(The)40 b(issue)h(at)e(hand)h(is)g(whic)m(h)h(p)s(oin)m(ters)f(a)
+ f(giv)m(en)i(memory)f(op)s(eration)f(ma)m(y)h(b)s(e)324
+ 4520 y(op)s(erating)31 b(on.)43 b(Although)31 b(some)i(op)s(erations)e
+ (ma)m(y)h(reduce)h(a)e(p)s(oin)m(ter|b)m(y)i(masking)324
+ 4641 y(o\013)k(all)g(of)f(the)i(top)f(bits)g(for)g(example|could)i
+ (that)e(p)s(oin)m(ter)g(v)-5 b(alue)38 b(ha)m(v)m(e)g(b)s(een)g(cal-)
+ 324 4761 y(culated)e(and)g(used)h(in)f(this)g(instruction?)53
+ b(As)37 b(written,)g(the)f(algorithm)f(errs)i(on)e(the)324
+ 4881 y(side)e(of)g(caution.)43 b(Con)m(tin)m(uing)34
+ b(our)f(example:)1894 5251 y(11)p eop end
+ %%Page: 12 12
+ TeXDict begin 12 11 bop 324 548 a Fg(char)52 b(x;)324
+ 789 y(char)g(*f\(\))324 909 y({)426 1029 y(long)h(ptr)f(=)f
+ (\(long\)&x;)426 1150 y(long)i(x)e(=)h(ptr)g(&)f(0x0000ffff;)426
+ 1270 y(long)i(y)e(=)h(ptr)g(&)f(0xffff0000;)426 1391
+ y(char)i(*p)e(=)h(\(char*\)\(x)i(+)d(y\);)426 1511 y(return)i(p;)324
+ 1631 y(})470 1839 y Fi(Chec)m(k)m(er)36 b(nev)m(er)f(actually)f(pro)m
+ (v)m(es)i(that)d(p)s(oin)m(ter)h Fg(p)f Fi(is)h(correctly)h(p)s(oin)m
+ (ting)f(to)f(our)324 1959 y(c)m(haracter)41 b Fg(x)p
+ Fi(.)67 b(Through)40 b(data-\015o)m(w,)j(c)m(hec)m(k)m(er)g(kno)m(ws)f
+ (that)e(the)g(only)h(p)s(oin)m(ter)g(con-)324 2079 y(tributing)c(to)f
+ Fg(p)g Fi(is)h Fg(&x)p Fi(.)56 b(W)-8 b(e)37 b(can)f(then)h(state)g(is)
+ g(that)f(an)m(y)i(access)g(through)e Fg(p)h Fi(either)324
+ 2200 y(refers)c(to)g Fg(&x)p Fi(,)g(or)f(else)i(refers)g(to)e
+ (indeterminate)j(memory)f(as)e(an)h(in)m(v)-5 b(alid)34
+ b(access.)45 b(A)m(t)324 2320 y(this)33 b(time,)h(c)m(hec)m(k)m(er)i
+ (is)d(unable)h(to)e(determine)j(whether)f(the)f(\014nal)g(p)s(oin)m
+ (ter)g(is)h(in)f(fact)324 2441 y(v)-5 b(alid,)33 b(and)f(so)h(mak)m(es)
+ h(the)f(conserv)-5 b(ativ)m(e)35 b(assumption)f(that)e(it)h(is.)324
+ 2727 y Fh(4.1)135 b(P)l(oin)l(ter)46 b(Analysis)324 2911
+ y Fi(Chec)m(k)m(er's)31 b(metho)s(d)d(of)g(p)s(oin)m(ter)g(analysis)h
+ (is)g(\015o)m(w-based,)h(t)m(yp)s(e-ignoran)m(t)e(and)g(whole-)324
+ 3032 y(program)g(approac)m(h)i(starting)f(with)g(the)h(p)s(oin)m(ts)f
+ (of)g(creation,)h(similar)g(to)e(Andersen's)324 3152
+ y(Analysis[And94)r(])21 b(or)h(P)m(oin)m(ts-T)-8 b(o)23
+ b(Analysis)g(using)f(Binary)h(Decision)f(Diagrams[BLQ)3531
+ 3116 y Fe(+)3590 3152 y Fi(03)o(].)324 3273 y(P)m(oin)m(ts)49
+ b(of)d(creation)i(are)g(explicit)h(allo)s(cations,)i(global)c(v)-5
+ b(ariables)48 b(and)g(functions,)324 3393 y(whic)m(h)40
+ b(ma)m(y)g(b)s(e)f(dereferenced.)65 b(Eac)m(h)40 b(of)e(these)i(allo)s
+ (cations)f(is)h(a)e(region)h(from)g(the)324 3513 y(base)33
+ b(p)s(oin)m(ter)g(up)g(to)f(a)h(size)g(whic)m(h)h(ma)m(y)g(not)e(b)s(e)
+ h(kno)m(wn)h(un)m(til)f(execution)h(time.)470 3634 y(The)29
+ b(set)h(of)d(instructions)j(op)s(erating)f(on)f(these)i(p)s(oin)m(ters)
+ f(is)g(then)g(calculated)g(as)g(a)324 3754 y(transitiv)m(e)37
+ b(closure)g(through)e(the)h(instructions.)54 b(Eac)m(h)37
+ b(instruction)g(is)f(tagged)f(with)324 3874 y(the)i(exhaustiv)m(e)j
+ (set)e(of)e(p)s(oin)m(ters)i(that)f(its)g(result)h(ma)m(y)g(b)s(e)f(an)
+ g(expression)i(of.)57 b(The)324 3995 y(algorithm)32 b(to)g(ac)m(hiev)m
+ (e)j(this)e(is)g(describ)s(ed)i(b)m(y)e(three)h(discrete)g(passes:)443
+ 4202 y(1.)49 b(Starting)31 b(at)g(eac)m(h)i(p)s(oin)m(t)e(of)g
+ (creation,)h(iterate)g(through)g(the)g(list)g(of)f(users)h(and)568
+ 4322 y(follo)m(w)24 b(through)g(its)h(users)g(transitiv)m(ely)-8
+ b(.)43 b(This)25 b(pro)s(duces)g(a)f(tree)h(where)g(the)g(leaf)568
+ 4443 y(no)s(des)i(are)h(memory)g(loads,)h(or)d(instructions)j(that)e
+ (ha)m(v)m(e)i(no)e(useful)h(result)g(suc)m(h)568 4563
+ y(as)d(branc)m(hes,)j(memory)e(stores)g(or)f(frees.)41
+ b(The)26 b(result)g(of)f(an)m(y)g(other)g(instruction)568
+ 4684 y(is)33 b(assumed)h(to)e(b)s(e)h(a)f(function)h(of)f(the)i(base)f
+ (p)s(oin)m(ter.)443 4882 y(2.)49 b(The)37 b(load-store)f(pairing)g
+ (pass)i(\014nds)f(matc)m(hing)g(store)g(instructions)h(for)e(eac)m(h)
+ 568 5002 y(load)c(instruction)h(to)f(see)i(if)e(a)g(p)s(oin)m(ter)h
+ (could)g(ha)m(v)m(e)h(b)s(een)f(stored)g(there.)44 b(If)32
+ b(so,)1894 5251 y(12)p eop end
+ %%Page: 13 13
+ TeXDict begin 13 12 bop 568 548 a Fi(the)33 b(result)g(of)g(this)g
+ (load)g(instruction)h(is)f(also)g(tagged)f(with)h(the)h(same)f(p)s(oin)
+ m(ter)568 668 y(and)f(w)m(e)i(m)m(ust)g(rep)s(eat)e(step)i(one.)568
+ 830 y(As)26 b(w)m(ell)g(as)g(stores,)i(w)m(e)f(also)e(pair)h(loads)f
+ (with)h(global)g(v)-5 b(ariables)26 b(that)f(ma)m(y)h(ha)m(v)m(e)568
+ 951 y(b)s(een)33 b(initialized)h(with)f(the)g(address)h(of)e(another)h
+ (global)f(v)-5 b(ariable.)443 1154 y(3.)49 b(Finally)-8
+ b(,)42 b(a)e(p)s(oin)m(ter)g(ma)m(y)h(b)s(e)g(laundered)g(through)f
+ (the)h(CF)m(G.)f(The)h(example)568 1274 y(program)46
+ b(on)h(the)h(follo)m(wing)f(page)g(demonstrates)i(this)f(tec)m(hnique)h
+ (using)f(a)568 1395 y(branc)m(h)26 b(instruction)i(to)d(c)m(ho)s(ose)i
+ (a)f(basic)g(blo)s(c)m(k)h(based)g(on)f(a)f(bit)i(in)f(the)g(p)s(oin)m
+ (ter.)568 1515 y(Eac)m(h)31 b(basic)g(blo)s(c)m(k)g(stores)g(0)f(or)g
+ (1)g(to)g(an)g(arra)m(y)-8 b(.)43 b(There)31 b(is)g(no)f(direct)h(data)
+ f(\015o)m(w)568 1636 y(from)35 b(the)g(p)s(oin)m(ter)h(in)m(to)g(the)f
+ (arra)m(y)-8 b(.)52 b(Rep)s(eat)35 b(this)h(32)f(times)h(to)f(leak)h(a)
+ f(32-bit)568 1756 y(p)s(oin)m(ter.)568 1918 y(In)23 b(order)g(to)g
+ (detect)h(this,)i(w)m(e)e(note)f(an)m(y)g(branc)m(h)h(statemen)m(t)h
+ (that)e(is)g(conditional)568 2038 y(on)36 b(a)h(p)s(oin)m(ter)g(v)-5
+ b(alue.)57 b(The)37 b(p)s(oin)m(ter)h(v)-5 b(alue)37
+ b(is)g(assumed)i(to)d(b)s(e)h(kno)m(wn)h(in)f(the)568
+ 2159 y(basic)h(blo)s(c)m(ks)g(link)m(ed)h(to)e(from)g(the)g(branc)m(h,)
+ j(and)d(transitiv)m(ely)i(in)f(the)f(blo)s(c)m(ks)568
+ 2279 y(that)h(it)h(leads)h(to,)g(ending)g(where)g(the)g(paths)f(of)g
+ (the)g(branc)m(h)h(con)m(v)m(erge.)64 b(W)-8 b(e)568
+ 2399 y(calculate)28 b(this)g(b)m(y)h(taking)f(the)g(set)g(of)f(basic)h
+ (blo)s(c)m(ks)h(reac)m(hable)g(starting)f(at)f(the)568
+ 2520 y(branc)m(h,)h(and)e(remo)m(ving)h(the)g(in)m(tersection)h(of)d
+ (basic)i(blo)s(c)m(ks)g(reac)m(hable)h(b)m(y)f(eac)m(h)568
+ 2640 y(of)38 b(the)h(branc)m(h's)h(conditions.)63 b(The)40
+ b(result)f(is)h(the)f(set)g(of)f(blo)s(c)m(ks)j(that)d(could)568
+ 2760 y(exp)s(ose)c(the)f(p)s(oin)m(ter)g(v)-5 b(alue.)568
+ 2922 y(Within)31 b(these)i(blo)s(c)m(ks,)f(an)m(y)g(store)f(to)g
+ (memory)h(could)g(p)s(oten)m(tially)g(b)s(e)f(leaking)568
+ 3043 y(the)e(p)s(oin)m(ter,)i(ev)m(en)g(the)f(store)g(of)f(a)g(constan)
+ m(t.)43 b(As)30 b(suc)m(h)h(all)e(stores)h(are)g(tagged.)568
+ 3163 y(More)42 b(improbable)g(is)g(that)g(the)g(result)g(of)f(all)h
+ (loads)g(m)m(ust)g(also)g(b)s(e)g(tagged.)568 3284 y(One)47
+ b(example)h(w)m(ould)g(b)s(e)f(a)g(32)f(lev)m(els)j(of)e(nested)h(if)f
+ (statemen)m(ts)i(uniquely)568 3404 y(iden)m(tifying)39
+ b(eac)m(h)g(p)s(ossible)g(v)-5 b(alue)39 b(of)e(a)h(32-bit)f(p)s(oin)m
+ (ter,)j(then)f(dereferencing)568 3524 y(that)32 b(constan)m(t)h(v)-5
+ b(alue.)568 3686 y(After)39 b(that,)i(newly)g(de\014ned)g(SSA)f(v)-5
+ b(ariables)40 b(inside)h(these)g(basic)f(blo)s(c)m(ks)h(are)568
+ 3807 y(tagged.)f(The)26 b(successor)h(blo)s(c)m(ks)f(are)f(c)m(hec)m(k)
+ m(ed)j(to)c(see)i(if)f(there)g(are)g(an)m(y)h Ff(\036)p
+ Fi(-no)s(des)568 3927 y(leading)h(bac)m(k)h(in)m(to)f(the)g(set.)42
+ b(If)27 b(so,)h(they)g(are)e(tagged)h(as)g(w)m(ell.)42
+ b(No)m(w)28 b(that)e(these)568 4047 y(new)38 b(instructions)i(ha)m(v)m
+ (e)f(b)s(een)f(added)g(to)g(the)g(closure,)i(w)m(e)f(m)m(ust)f(rep)s
+ (eat)g(the)568 4168 y(algorithm)32 b(starting)h(at)f(step)h(one.)470
+ 4396 y(Through)50 b(this)g(algorithm,)k(the)c(c)m(hec)m(k)m(er)j(solv)m
+ (es)e(for)e(the)h(set)h(of)e(all)g(p)s(ossible)324 4516
+ y(p)s(oin)m(ter)33 b(v)-5 b(alues)33 b(in)m(v)m(olv)m(ed)i(in)e(the)g
+ (execution)h(of)f(an)m(y)g(giv)m(en)g(instruction.)1894
+ 5251 y(13)p eop end
+ %%Page: 14 14
+ TeXDict begin 14 13 bop 324 4767 a @beginspecial 36 @llx
+ 36 @lly 1012 @urx 1334 @ury 3885 @rwi @setspecial
+ %%BeginDocument: example1.ps
+ %!PS-Adobe-2.0
+ %%Creator: dot version 2.8 (Sun Apr 9 22:27:31 UTC 2006)
+ %%For: (nicholas) Nicholas
+ %%Title: example1
+ %%Pages: (atend)
+ %%BoundingBox: 36 36 1012 1334
+ %%EndComments
+ save
+ %%BeginProlog
+ /DotDict 200 dict def
+ DotDict begin
+
+ /setupLatin1 {
+ mark
+ /EncodingVector 256 array def
+ EncodingVector 0
+
+ ISOLatin1Encoding 0 255 getinterval putinterval
+ EncodingVector 45 /hyphen put
+
+ % Set up ISO Latin 1 character encoding
+ /starnetISO {
+ dup dup findfont dup length dict begin
+ { 1 index /FID ne { def }{ pop pop } ifelse
+ } forall
+ /Encoding EncodingVector def
+ currentdict end definefont
+ } def
+ /Times-Roman starnetISO def
+ /Times-Italic starnetISO def
+ /Times-Bold starnetISO def
+ /Times-BoldItalic starnetISO def
+ /Helvetica starnetISO def
+ /Helvetica-Oblique starnetISO def
+ /Helvetica-Bold starnetISO def
+ /Helvetica-BoldOblique starnetISO def
+ /Courier starnetISO def
+ /Courier-Oblique starnetISO def
+ /Courier-Bold starnetISO def
+ /Courier-BoldOblique starnetISO def
+ cleartomark
+ } bind def
+
+ %%BeginResource: procset graphviz 0 0
+ /coord-font-family /Times-Roman def
+ /default-font-family /Times-Roman def
+ /coordfont coord-font-family findfont 8 scalefont def
+
+ /InvScaleFactor 1.0 def
+ /set_scale {
+ dup 1 exch div /InvScaleFactor exch def
+ dup scale
+ } bind def
+
+ % styles
+ /solid { [] 0 setdash } bind def
+ /dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+ /dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+ /invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+ /bold { 2 setlinewidth } bind def
+ /filled { } bind def
+ /unfilled { } bind def
+ /rounded { } bind def
+ /diagonals { } bind def
+
+ % hooks for setting color
+ /nodecolor { sethsbcolor } bind def
+ /edgecolor { sethsbcolor } bind def
+ /graphcolor { sethsbcolor } bind def
+ /nopcolor {pop pop pop} bind def
+
+ /beginpage { % i j npages
+ /npages exch def
+ /j exch def
+ /i exch def
+ /str 10 string def
+ npages 1 gt {
+ gsave
+ coordfont setfont
+ 0 0 moveto
+ (\() show i str cvs show (,) show j str cvs show (\)) show
+ grestore
+ } if
+ } bind def
+
+ /set_font {
+ findfont exch
+ scalefont setfont
+ } def
+
+ % draw aligned label in bounding box aligned to current point
+ /alignedtext { % width adj text
+ /text exch def
+ /adj exch def
+ /width exch def
+ gsave
+ width 0 gt {
+ text stringwidth pop adj mul 0 rmoveto
+ } if
+ [] 0 setdash
+ text show
+ grestore
+ } def
+
+ /boxprim { % xcorner ycorner xsize ysize
+ 4 2 roll
+ moveto
+ 2 copy
+ exch 0 rlineto
+ 0 exch rlineto
+ pop neg 0 rlineto
+ closepath
+ } bind def
+
+ /ellipse_path {
+ /ry exch def
+ /rx exch def
+ /y exch def
+ /x exch def
+ matrix currentmatrix
+ newpath
+ x y translate
+ rx ry scale
+ 0 0 1 0 360 arc
+ setmatrix
+ } bind def
+
+ /endpage { showpage } bind def
+ /showpage { } def
+
+ /layercolorseq
+ [ % layer color sequence - darkest to lightest
+ [0 0 0]
+ [.2 .8 .8]
+ [.4 .8 .8]
+ [.6 .8 .8]
+ [.8 .8 .8]
+ ]
+ def
+
+ /layerlen layercolorseq length def
+
+ /setlayer {/maxlayer exch def /curlayer exch def
+ layercolorseq curlayer 1 sub layerlen mod get
+ aload pop sethsbcolor
+ /nodecolor {nopcolor} def
+ /edgecolor {nopcolor} def
+ /graphcolor {nopcolor} def
+ } bind def
+
+ /onlayer { curlayer ne {invis} if } def
+
+ /onlayers {
+ /myupper exch def
+ /mylower exch def
+ curlayer mylower lt
+ curlayer myupper gt
+ or
+ {invis} if
+ } def
+
+ /curlayer 0 def
+
+ %%EndResource
+ %%EndProlog
+ %%BeginSetup
+ 14 default-font-family set_font
+ 1 setmiterlimit
+ % /arrowlength 10 def
+ % /arrowwidth 5 def
+
+ % make sure pdfmark is harmless for PS-interpreters other than Distiller
+ /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+ % make '<<' and '>>' safe on PS Level 1 devices
+ /languagelevel where {pop languagelevel}{1} ifelse
+ 2 lt {
+ userdict (<<) cvn ([) cvn load put
+ userdict (>>) cvn ([) cvn load put
+ } if
+
+ %%EndSetup
+ %%Page: 1 1
+ %%PageBoundingBox: 36 36 1012 1334
+ %%PageOrientation: Portrait
+ gsave
+ 36 36 976 1298 boxprim clip newpath
+ 36 36 translate
+ 0 0 1 beginpage
+ 1.0000 set_scale
+ 4 4 translate 0 rotate
+ 0.000 0.000 1.000 graphcolor
+ 0.000 0.000 1.000 graphcolor
+ newpath -6 -6 moveto
+ -6 1296 lineto
+ 974 1296 lineto
+ 974 -6 lineto
+ closepath
+ fill
+ 0.000 0.000 1.000 graphcolor
+ newpath -6 -6 moveto
+ -6 1296 lineto
+ 974 1296 lineto
+ 974 -6 lineto
+ closepath
+ stroke
+ 0.000 0.000 0.000 graphcolor
+ 14.00 /Times-Roman set_font
+ gsave 10 dict begin
+ 417 7 moveto
+ (CFG for 'main' function)
+ [9.36 7.68 10.08 3.6 4.08 6.96 4.8 3.6 2.64 10.8 6.24 3.84 6.96 2.64 3.6 4.56 6.96 6.96 6.24 3.84 3.84 6.96 6.96]
+ xshow
+ end grestore
+ % Node0x85fc3c8
+ gsave 10 dict begin
+ newpath 450 1146 moveto
+ 649 1146 lineto
+ 649 1290 lineto
+ 450 1290 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 458 1273 moveto
+ (entry:)
+ [6.24 6.96 3.84 5.04 6.72 3.84]
+ xshow
+ 458 1257 moveto
+ ( %t = alloca int )
+ [3.6 11.76 3.84 3.6 7.92 3.6 6.24 3.84 3.84 6.96 6.24 6.24 3.6 3.84 6.96 3.84 3.6]
+ xshow
+ 458 1241 moveto
+ ( %v = alloca [32 x bool] )
+ [3.6 11.76 6.96 3.6 7.92 3.6 6.24 3.84 3.84 6.96 6.24 6.24 3.6 4.56 6.96 6.96 3.6 6.96 3.6 6.96 6.96 6.96 3.84 4.56 3.6]
+ xshow
+ 458 1225 moveto
+ ( call void %__main\( \))
+ [3.6 6.24 6.24 3.84 3.84 3.6 6.48 6.96 3.84 6.96 3.6 11.76 6.96 6.96 10.8 6.24 3.84 6.96 4.56 3.6 4.56]
+ xshow
+ 458 1209 moveto
+ ( store int 42, int* %t)
+ [3.6 5.28 3.84 6.96 4.8 6.24 3.6 3.84 6.96 3.84 3.6 6.96 6.96 3.6 3.6 3.84 6.96 3.84 6.96 3.6 11.76 3.84]
+ xshow
+ 458 1193 moveto
+ ( %tmp.6 = cast int* %t to ulong )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 3.84 6.96 3.84 6.96 3.6 11.76 3.84 3.6 3.84 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6]
+ xshow
+ 458 1177 moveto
+ ( br label %no_exit.0)
+ [3.6 6.96 4.8 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96]
+ xshow
+ end grestore
+ newpath 450 1170 moveto
+ 649 1170 lineto
+ stroke
+ gsave 10 dict begin
+ 549 1153 moveto 5.0 -0.5 ( ) alignedtext
+ end grestore
+ end grestore
+ % Node0x85feac8
+ gsave 10 dict begin
+ newpath 328 948 moveto
+ 771 948 lineto
+ 771 1108 lineto
+ 328 1108 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 336 1091 moveto
+ (no_exit.0: )
+ [6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.84 3.6]
+ xshow
+ 336 1075 moveto
+ ( %i.0.0.0 = phi uint [ 0, %entry ], [ %inc.08, %then.0 ], [ %inc.0, %else.0 ] )
+ [3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 7.92 3.6 6.96 6.96 3.84 3.6 6.96 3.84 6.96 3.84 3.6 4.56 3.6 6.96 3.6 3.6 11.76 6.24 6.96 3.84 5.04 6.96 3.6 4.56 3.6 3.6 4.56 3.6 11.76 3.84 6.96 6.24 3.6 6.96 6.96 3.6 3.6 11.76 4.08 6.96 6.24 6.96 3.6 6.96 3.6 4.56 3.6 3.6 4.56 3.6 11.76 3.84 6.96 6.24 3.6 6.96 3.6 3.6 11.76 6.24 3.84 5.52 6.24 3.6 6.96 3.6 4.56 3.6]
+ xshow
+ 336 1059 moveto
+ ( %tmp.11 = cast uint %i.0.0.0 to ubyte )
+ [3.6 11.76 3.84 10.56 6.96 2.64 5.76 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 6.96 6.48 6.96 3.84 6.24 3.6]
+ xshow
+ 336 1043 moveto
+ ( %tmp.12 = shl int 1, ubyte %tmp.11 )
+ [3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 7.92 3.6 5.52 6.96 3.84 3.6 3.84 6.96 3.84 3.6 6.24 3.6 3.6 6.96 6.48 6.96 3.84 6.24 3.6 11.76 3.84 10.56 6.96 2.64 5.76 6.96 3.6]
+ xshow
+ 336 1027 moveto
+ ( %tmp.13 = cast int %tmp.12 to ulong )
+ [3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 3.84 6.96 3.84 3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 3.84 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6]
+ xshow
+ 336 1011 moveto
+ ( %tmp.15 = and ulong %tmp.13, %tmp.6 )
+ [3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 7.92 3.6 6.24 6.96 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 3.6 11.76 3.84 10.56 6.96 3.6 6.96 3.6]
+ xshow
+ 336 995 moveto
+ ( %tmp.16 = seteq ulong %tmp.15, 0 )
+ [3.6 11.76 3.84 10.56 6.96 2.64 6 6.96 3.6 7.92 3.6 5.52 6 3.84 6.24 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 3.6 6.96 3.6]
+ xshow
+ 336 979 moveto
+ ( br bool %tmp.16, label %else.0, label %then.0)
+ [3.6 6.96 4.8 3.6 6.96 6.96 6.96 3.84 3.6 11.76 3.84 10.56 6.96 2.64 6 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.24 3.84 5.52 6.24 3.6 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 4.08 6.96 6.24 6.96 3.6 6.96]
+ xshow
+ end grestore
+ newpath 328 972 moveto
+ 771 972 lineto
+ stroke
+ gsave 10 dict begin
+ 439 955 moveto 9.0 -0.5 (T) alignedtext
+ end grestore
+ newpath 550 948 moveto
+ 550 972 lineto
+ stroke
+ gsave 10 dict begin
+ 660 955 moveto 8.0 -0.5 (F) alignedtext
+ end grestore
+ end grestore
+ % Node0x85fc3c8->Node0x85feac8
+ newpath 549 1146 moveto
+ 549 1139 549 1129 549 1118 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 553 1118 moveto
+ 549 1108 lineto
+ 546 1118 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 553 1118 moveto
+ 549 1108 lineto
+ 546 1118 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85fedb0
+ gsave 10 dict begin
+ newpath 176 766 moveto
+ 565 766 lineto
+ 565 910 lineto
+ 176 910 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 184 893 moveto
+ (else.0: )
+ [6.24 3.84 5.52 6.24 3.6 6.96 3.84 3.6]
+ xshow
+ 184 877 moveto
+ ( %tmp.21 = cast uint %i.0.0.0 to long )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.24 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 3.84 6.96 6.96 6.96 3.6]
+ xshow
+ 184 861 moveto
+ ( %tmp.22 = getelementptr [32 x bool]* %v, long 0, long %tmp.21 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.72 6 3.84 6.24 3.84 6.24 10.8 6.24 6.96 3.84 6.96 3.84 4.8 3.6 4.56 6.96 6.96 3.6 6.96 3.6 6.96 6.96 6.96 3.84 4.56 6.96 3.6 11.76 6 3.6 3.6 3.84 6.96 6.96 6.96 3.6 6.96 3.6 3.6 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.24 6.96 3.6]
+ xshow
+ 184 845 moveto
+ ( store bool false, bool* %tmp.22)
+ [3.6 5.28 3.84 6.96 4.8 6.24 3.6 6.96 6.96 6.96 3.84 3.6 4.32 6.24 3.84 5.52 6.24 3.6 3.6 6.96 6.96 6.96 3.84 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96]
+ xshow
+ 184 829 moveto
+ ( %inc.0 = add uint %i.0.0.0, 1 )
+ [3.6 11.76 3.84 6.96 6.24 3.6 6.96 3.6 7.92 3.6 6.24 6.96 6.96 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 3.6 6.96 3.6]
+ xshow
+ 184 813 moveto
+ ( %tmp.8 = setgt uint %inc.0, 31 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 3.6 7.92 3.6 5.52 6 3.84 6.96 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 6.96 6.24 3.6 6.96 3.6 3.6 6 6.96 3.6]
+ xshow
+ 184 797 moveto
+ ( br bool %tmp.8, label %loopexit.0, label %no_exit.0)
+ [3.6 6.96 4.8 3.6 6.96 6.96 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96]
+ xshow
+ end grestore
+ newpath 176 790 moveto
+ 565 790 lineto
+ stroke
+ gsave 10 dict begin
+ 273 773 moveto 9.0 -0.5 (T) alignedtext
+ end grestore
+ newpath 371 766 moveto
+ 371 790 lineto
+ stroke
+ gsave 10 dict begin
+ 468 773 moveto 8.0 -0.5 (F) alignedtext
+ end grestore
+ end grestore
+ % Node0x85feac8->Node0x85fedb0
+ newpath 432 948 moveto
+ 428 940 422 930 416 919 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 419 917 moveto
+ 411 910 lineto
+ 413 920 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 419 917 moveto
+ 411 910 lineto
+ 413 920 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85fec60
+ gsave 10 dict begin
+ newpath 582 766 moveto
+ 968 766 lineto
+ 968 910 lineto
+ 582 910 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 590 893 moveto
+ (then.0: )
+ [4.08 6.96 6.24 6.96 3.6 6.96 3.84 3.6]
+ xshow
+ 590 877 moveto
+ ( %tmp.18 = cast uint %i.0.0.0 to long )
+ [3.6 11.76 3.84 10.56 6.96 2.64 6 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 3.84 6.96 6.96 6.96 3.6]
+ xshow
+ 590 861 moveto
+ ( %tmp.19 = getelementptr [32 x bool]* %v, long 0, long %tmp.18 )
+ [3.6 11.76 3.84 10.56 6.96 2.64 6 6.96 3.6 7.92 3.6 6.72 6 3.84 6.24 3.84 6.24 10.8 6.24 6.96 3.84 6.96 3.84 4.8 3.6 4.56 6.96 6.96 3.6 6.96 3.6 6.96 6.96 6.96 3.84 4.56 6.96 3.6 11.76 6 3.6 3.6 3.84 6.96 6.96 6.96 3.6 6.96 3.6 3.6 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 2.64 6 6.96 3.6]
+ xshow
+ 590 845 moveto
+ ( store bool true, bool* %tmp.19)
+ [3.6 5.28 3.84 6.96 4.8 6.24 3.6 6.96 6.96 6.96 3.84 3.6 3.84 5.04 6.96 6.24 3.6 3.6 6.96 6.96 6.96 3.84 6.96 3.6 11.76 3.84 10.56 6.96 2.64 6 6.96]
+ xshow
+ 590 829 moveto
+ ( %inc.08 = add uint %i.0.0.0, 1 )
+ [3.6 11.76 3.84 6.96 6.24 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.96 6.96 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 3.6 6.96 3.6]
+ xshow
+ 590 813 moveto
+ ( %tmp.811 = setgt uint %inc.08, 31 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6 5.76 6.96 3.6 7.92 3.6 5.52 6 3.84 6.96 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 6.96 6.24 3.6 6.96 6.96 3.6 3.6 6 6.96 3.6]
+ xshow
+ 590 797 moveto
+ ( br bool %tmp.811, label %loopexit.0, label %no_exit.0)
+ [3.6 6.96 4.8 3.6 6.96 6.96 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6 5.76 6.24 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96]
+ xshow
+ end grestore
+ newpath 582 790 moveto
+ 968 790 lineto
+ stroke
+ gsave 10 dict begin
+ 678 773 moveto 9.0 -0.5 (T) alignedtext
+ end grestore
+ newpath 775 766 moveto
+ 775 790 lineto
+ stroke
+ gsave 10 dict begin
+ 871 773 moveto 8.0 -0.5 (F) alignedtext
+ end grestore
+ end grestore
+ % Node0x85feac8->Node0x85fec60
+ newpath 686 948 moveto
+ 694 943 703 937 711 930 curveto
+ 715 926 719 922 722 918 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 725 920 moveto
+ 729 910 lineto
+ 720 915 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 725 920 moveto
+ 729 910 lineto
+ 720 915 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85fedb0->Node0x85feac8
+ newpath 472 790 moveto
+ 480 817 502 883 520 938 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 517 939 moveto
+ 523 948 lineto
+ 523 937 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 517 939 moveto
+ 523 948 lineto
+ 523 937 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85ff7f0
+ gsave 10 dict begin
+ newpath 459 664 moveto
+ 589 664 lineto
+ 589 728 lineto
+ 459 728 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 467 711 moveto
+ (loopexit.0: )
+ [3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.84 3.6]
+ xshow
+ 467 695 moveto
+ ( br label %no_exit.1)
+ [3.6 6.96 4.8 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.96 6.96 6.96 5.76 6.96 3.84 3.84 2.64 6.96]
+ xshow
+ end grestore
+ newpath 459 688 moveto
+ 589 688 lineto
+ stroke
+ gsave 10 dict begin
+ 524 671 moveto 5.0 -0.5 ( ) alignedtext
+ end grestore
+ end grestore
+ % Node0x85fedb0->Node0x85ff7f0
+ newpath 313 766 moveto
+ 349 754 405 736 449 721 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 450 724 moveto
+ 459 718 lineto
+ 448 718 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 450 724 moveto
+ 459 718 lineto
+ 448 718 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85fec60->Node0x85feac8
+ newpath 855 790 moveto
+ 820 817 732 886 659 942 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 657 939 moveto
+ 651 948 lineto
+ 661 945 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 657 939 moveto
+ 651 948 lineto
+ 661 945 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85fec60->Node0x85ff7f0
+ newpath 654 766 moveto
+ 637 757 615 745 593 733 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 594 730 moveto
+ 584 728 lineto
+ 591 736 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 594 730 moveto
+ 584 728 lineto
+ 591 736 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85ffc18
+ gsave 10 dict begin
+ newpath 320 482 moveto
+ 729 482 lineto
+ 729 626 lineto
+ 320 626 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 328 609 moveto
+ (no_exit.1: )
+ [6.96 6.96 6.96 5.76 6.96 3.84 3.84 2.64 6.96 3.84 3.6]
+ xshow
+ 328 593 moveto
+ ( %i.1.0.0 = phi uint [ 0, %loopexit.0 ], [ %indvar.next, %loopentry.1 ] )
+ [3.6 11.76 3.84 2.64 6.24 3.6 6.96 3.6 6.96 3.6 7.92 3.6 6.96 6.96 3.84 3.6 6.96 3.84 6.96 3.84 3.6 4.56 3.6 6.96 3.6 3.6 11.76 3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.6 4.56 3.6 3.6 4.56 3.6 11.76 3.84 6.96 6.96 6.72 6.24 4.08 3.6 6.96 5.76 6.96 3.84 3.6 3.6 11.76 3.84 6.96 6.96 6.96 6.24 6.96 3.84 5.04 6 2.64 6.96 3.6 4.56 3.6]
+ xshow
+ 328 577 moveto
+ ( %ri.1.0 = phi ulong [ undef, %loopexit.0 ], [ %ri.0.0, %loopentry.1 ] )
+ [3.6 11.76 5.04 3.84 2.64 6.24 3.6 6.96 3.6 7.92 3.6 6.96 6.96 3.84 3.6 6.96 3.84 6.96 6.96 6.96 3.6 4.56 3.6 6.96 6.96 6.96 6.24 4.56 3.6 3.6 11.76 3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.6 4.56 3.6 3.6 4.56 3.6 11.76 5.04 3.84 3.6 6.96 3.6 6.96 3.6 3.6 11.76 3.84 6.96 6.96 6.96 6.24 6.96 3.84 5.04 6 2.64 6.96 3.6 4.56 3.6]
+ xshow
+ 328 561 moveto
+ ( %tmp.27 = cast uint %i.1.0.0 to long )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.72 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 2.64 6.24 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 3.84 6.96 6.96 6.96 3.6]
+ xshow
+ 328 545 moveto
+ ( %tmp.28 = getelementptr [32 x bool]* %v, long 0, long %tmp.27 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.72 6 3.84 6.24 3.84 6.24 10.8 6.24 6.96 3.84 6.96 3.84 4.8 3.6 4.56 6.96 6.96 3.6 6.96 3.6 6.96 6.96 6.96 3.84 4.56 6.96 3.6 11.76 6 3.6 3.6 3.84 6.96 6.96 6.96 3.6 6.96 3.6 3.6 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.72 6.96 3.6]
+ xshow
+ 328 529 moveto
+ ( %tmp.29 = load bool* %tmp.28 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 3.84 6.96 6.24 6.96 3.6 6.96 6.96 6.96 3.84 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6]
+ xshow
+ 328 513 moveto
+ ( br bool %tmp.29, label %then.1, label %else.1)
+ [3.6 6.96 4.8 3.6 6.96 6.96 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 4.08 6.96 6.24 6.96 2.64 6.24 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.24 3.84 5.52 6.24 2.64 6.96]
+ xshow
+ end grestore
+ newpath 320 506 moveto
+ 729 506 lineto
+ stroke
+ gsave 10 dict begin
+ 422 489 moveto 9.0 -0.5 (T) alignedtext
+ end grestore
+ newpath 525 482 moveto
+ 525 506 lineto
+ stroke
+ gsave 10 dict begin
+ 627 489 moveto 8.0 -0.5 (F) alignedtext
+ end grestore
+ end grestore
+ % Node0x85ff7f0->Node0x85ffc18
+ newpath 524 664 moveto
+ 524 656 524 647 524 636 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 528 636 moveto
+ 524 626 lineto
+ 521 636 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 528 636 moveto
+ 524 626 lineto
+ 521 636 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85ffe00
+ gsave 10 dict begin
+ newpath 258 308 moveto
+ 497 308 lineto
+ 497 436 lineto
+ 258 436 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 266 419 moveto
+ (then.1: )
+ [4.08 6.96 6.24 6.96 2.64 6.96 3.84 3.6]
+ xshow
+ 266 403 moveto
+ ( %tmp.32 = cast uint %i.1.0.0 to ubyte )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 2.64 6.24 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 6.96 6.48 6.96 3.84 6.24 3.6]
+ xshow
+ 266 387 moveto
+ ( %tmp.33 = shl int 1, ubyte %tmp.32 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 5.52 6.96 3.84 3.6 3.84 6.96 3.84 3.6 6.24 3.6 3.6 6.96 6.48 6.96 3.84 6.24 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6]
+ xshow
+ 266 371 moveto
+ ( %tmp.34 = cast int %tmp.33 to ulong )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 3.84 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.84 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6]
+ xshow
+ 266 355 moveto
+ ( %tmp.36 = or ulong %tmp.34, %ri.1.0 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.96 4.8 3.6 6.96 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.6 11.76 5.04 3.84 2.64 6.24 3.6 6.96 3.6]
+ xshow
+ 266 339 moveto
+ ( br label %loopentry.1)
+ [3.6 6.96 4.8 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 3.84 6.96 6.96 6.96 6.24 6.96 3.84 5.04 6 2.64 6.96]
+ xshow
+ end grestore
+ newpath 258 332 moveto
+ 497 332 lineto
+ stroke
+ gsave 10 dict begin
+ 377 315 moveto 5.0 -0.5 ( ) alignedtext
+ end grestore
+ end grestore
+ % Node0x85ffc18->Node0x85ffe00
+ newpath 418 482 moveto
+ 415 473 410 460 404 446 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 407 445 moveto
+ 401 436 lineto
+ 401 447 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 407 445 moveto
+ 401 436 lineto
+ 401 447 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85ffee0
+ gsave 10 dict begin
+ newpath 552 300 moveto
+ 800 300 lineto
+ 800 444 lineto
+ 552 444 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 560 427 moveto
+ (else.1: )
+ [6.24 3.84 5.52 6.24 2.64 6.96 3.84 3.6]
+ xshow
+ 560 411 moveto
+ ( %tmp.39 = cast uint %i.1.0.0 to ubyte )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 2.64 6.24 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 6.96 6.48 6.96 3.84 6.24 3.6]
+ xshow
+ 560 395 moveto
+ ( %tmp.40 = shl int 1, ubyte %tmp.39 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 5.52 6.96 3.84 3.6 3.84 6.96 3.84 3.6 6.24 3.6 3.6 6.96 6.48 6.96 3.84 6.24 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6]
+ xshow
+ 560 379 moveto
+ ( %tmp.41 = xor int %tmp.40, -1 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6 6.96 3.6 7.92 3.6 6.24 6.96 4.8 3.6 3.84 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.6 4.56 6.96 3.6]
+ xshow
+ 560 363 moveto
+ ( %tmp.42 = cast int %tmp.41 to ulong )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 3.84 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6 6.96 3.6 3.84 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6]
+ xshow
+ 560 347 moveto
+ ( %tmp.44 = and ulong %tmp.42, %ri.1.0 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 7.2 6.96 3.6 7.92 3.6 6.24 6.96 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.6 11.76 5.04 3.84 2.64 6.24 3.6 6.96 3.6]
+ xshow
+ 560 331 moveto
+ ( br label %loopentry.1)
+ [3.6 6.96 4.8 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 3.84 6.96 6.96 6.96 6.24 6.96 3.84 5.04 6 2.64 6.96]
+ xshow
+ end grestore
+ newpath 552 324 moveto
+ 800 324 lineto
+ stroke
+ gsave 10 dict begin
+ 676 307 moveto 5.0 -0.5 ( ) alignedtext
+ end grestore
+ end grestore
+ % Node0x85ffc18->Node0x85ffee0
+ newpath 632 482 moveto
+ 635 474 639 465 643 454 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 647 455 moveto
+ 647 444 lineto
+ 640 452 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 647 455 moveto
+ 647 444 lineto
+ 640 452 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85ffd60
+ gsave 10 dict begin
+ newpath 237 150 moveto
+ 620 150 lineto
+ 620 262 lineto
+ 237 262 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 245 245 moveto
+ (loopentry.1: )
+ [3.84 6.96 6.96 6.96 6.24 6.96 3.84 5.04 6 2.64 6.96 3.84 3.6]
+ xshow
+ 245 229 moveto
+ ( %ri.0.0 = phi ulong [ %tmp.36, %then.1 ], [ %tmp.44, %else.1 ] )
+ [3.6 11.76 5.04 3.84 3.6 6.96 3.6 6.96 3.6 7.92 3.6 6.96 6.96 3.84 3.6 6.96 3.84 6.96 6.96 6.96 3.6 4.56 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.6 11.76 4.08 6.96 6.24 6.96 2.64 6.96 3.6 4.56 3.6 3.6 4.56 3.6 11.76 3.84 10.56 6.96 3.6 7.2 6.96 3.6 3.6 11.76 6.24 3.84 5.52 6.24 2.64 6.96 3.6 4.56 3.6]
+ xshow
+ 245 213 moveto
+ ( %indvar.next = add uint %i.1.0.0, 1 )
+ [3.6 11.76 3.84 6.96 6.96 6.72 6.24 4.08 3.6 6.96 5.76 6.96 3.84 3.6 7.92 3.6 6.24 6.96 6.96 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 2.64 6.24 3.6 6.96 3.6 6.96 3.6 3.6 6.96 3.6]
+ xshow
+ 245 197 moveto
+ ( %exitcond = seteq uint %indvar.next, 32 )
+ [3.6 11.76 5.76 6.96 3.84 3.84 6.24 6.96 6.96 6.96 3.6 7.92 3.6 5.52 6 3.84 6.24 6.96 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 6.96 6.96 6.72 6.24 4.08 3.6 6.96 5.76 6.96 3.84 3.6 3.6 6.96 6.96 3.6]
+ xshow
+ 245 181 moveto
+ ( br bool %exitcond, label %loopexit.1, label %no_exit.1)
+ [3.6 6.96 4.8 3.6 6.96 6.96 6.96 3.84 3.6 11.76 5.76 6.96 3.84 3.84 6.24 6.96 6.96 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 2.64 6.24 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.96 6.96 6.96 5.76 6.96 3.84 3.84 2.64 6.96]
+ xshow
+ end grestore
+ newpath 237 174 moveto
+ 620 174 lineto
+ stroke
+ gsave 10 dict begin
+ 333 157 moveto 9.0 -0.5 (T) alignedtext
+ end grestore
+ newpath 429 150 moveto
+ 429 174 lineto
+ stroke
+ gsave 10 dict begin
+ 524 157 moveto 8.0 -0.5 (F) alignedtext
+ end grestore
+ end grestore
+ % Node0x85ffd60->Node0x85ffc18
+ newpath 524 174 moveto
+ 524 218 524 374 524 472 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 521 472 moveto
+ 524 482 lineto
+ 528 472 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 521 472 moveto
+ 524 482 lineto
+ 528 472 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x86002b0
+ gsave 10 dict begin
+ newpath 0 24 moveto
+ 667 24 lineto
+ 667 112 lineto
+ 0 112 lineto
+ closepath
+ stroke
+ gsave 10 dict begin
+ 8 95 moveto
+ (loopexit.1: )
+ [3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 2.64 6.96 3.84 3.6]
+ xshow
+ 8 79 moveto
+ ( %tmp.47 = cast ulong %ri.0.0 to int* )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.48 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 6.96 6.96 3.6 11.76 5.04 3.84 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 3.84 6.96 3.84 6.96 3.6]
+ xshow
+ 8 63 moveto
+ ( %tmp.51 = load int* %tmp.47 )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6 6.96 3.6 7.92 3.6 3.84 6.96 6.24 6.96 3.6 3.84 6.96 3.84 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.48 6.96 3.6]
+ xshow
+ 8 47 moveto
+ ( %tmp.48 = call int \(sbyte*, ...\)* %printf\( sbyte* getelementptr \([4 x sbyte]* %.str_5, long 0, long 0\), int %tmp.51 \) )
+ [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.24 3.84 3.84 3.6 3.84 6.96 3.84 3.6 4.56 5.52 6.48 6.96 3.84 6.24 6.96 3.6 3.6 3.6 3.6 3.6 4.56 6.96 3.6 11.76 6.96 5.04 3.84 6.96 3.84 4.56 4.56 3.6 5.52 6.48 6.96 3.84 6.24 6.96 3.6 6.72 6 3.84 6.24 3.84 6.24 10.8 6.24 6.96 3.84 6.96 3.84 4.8 3.6 4.56 4.56 6.96 3.6 6.96 3.6 5.52 6.48 6.96 3.84 6.24 4.56 6.96 3.6 11.76 3.6 5.28 3.84 4.8 6.96 6.96 3.6 3.6 3.84 6.96 6.96 6.96 3.6 6.96 3.6 3.6 3.84 6.96 6.96 6.96 3.6 6.96 4.56 3.6 3.6 3.84 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6 6.96 3.6 4.56 3.6]
+ xshow
+ 8 31 moveto
+ ( ret int 0)
+ [3.6 4.8 6 3.84 3.6 3.84 6.96 3.84 3.6 6.96]
+ xshow
+ end grestore
+ end grestore
+ % Node0x85ffd60->Node0x86002b0
+ newpath 333 150 moveto
+ 333 142 333 133 333 122 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 337 122 moveto
+ 333 112 lineto
+ 330 122 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 337 122 moveto
+ 333 112 lineto
+ 330 122 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85ffe00->Node0x85ffd60
+ newpath 383 308 moveto
+ 387 299 393 286 399 272 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 403 273 moveto
+ 403 262 lineto
+ 396 270 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 403 273 moveto
+ 403 262 lineto
+ 396 270 lineto
+ closepath
+ stroke
+ end grestore
+ % Node0x85ffee0->Node0x85ffd60
+ newpath 646 300 moveto
+ 625 291 597 279 567 266 curveto
+ stroke
+ gsave 10 dict begin
+ solid
+ 1 setlinewidth
+ 0.000 0.000 0.000 edgecolor
+ newpath 569 263 moveto
+ 558 262 lineto
+ 566 269 lineto
+ closepath
+ fill
+ 0.000 0.000 0.000 edgecolor
+ newpath 569 263 moveto
+ 558 262 lineto
+ 566 269 lineto
+ closepath
+ stroke
+ end grestore
+ endpage
+ showpage
+ grestore
+ %%PageTrailer
+ %%EndPage: 1
+ %%Trailer
+ %%Pages: 1
+ end
+ restore
+ %%EOF
+
+ %%EndDocument
+ @endspecial 388 4970 a Fi(Figure)32 b(1:)44 b(Break)33
+ b(up)g(a)f(p)s(oin)m(ter)h(in)m(to)g(an)f(arra)m(y)h(of)f(b)s(o)s
+ (oleans)h(and)f(reassem)m(ble)k(it)1894 5251 y(14)p eop
+ end
+ %%Page: 15 15
+ TeXDict begin 15 14 bop 324 548 a Fk(5)161 b(F)-13 b(uture)52
+ b(W)-13 b(ork)324 767 y Fi(The)25 b(implemen)m(tation)i(is)e(missing)h
+ (some)g(critical)f(features)g(prev)m(en)m(ting)i(it)e(from)f(b)s(eing)
+ 324 887 y(used)g(to)e(v)m(erify)i(real)f(w)m(orld)g(soft)m(w)m(are.)41
+ b(Primarily)-8 b(,)26 b(it)c(lac)m(ks)i(in)m(terpro)s(cedural)g
+ (analysis.)324 1008 y(Note)36 b(that)h(this)g(is)g(not)f(a)h
+ (theoretical)g(limitation|an)f(inliner)i(can)e(rewrite)i(a)e(pro-)324
+ 1128 y(gram)27 b(without)i(function)f(calls|nor)g(is)h(it)e(a)h
+ (limitation)g(due)h(to)e(the)h(use)h(of)f(LL)-11 b(VM|)324
+ 1249 y(LL)g(VM)23 b(is)g(famous)g(for)f(p)s(erforming)g(extensiv)m(e)k
+ (in)m(terpro)s(cedural)e(optimizations|but)324 1369 y(merely)34
+ b(a)e(limit)h(of)f(the)h(curren)m(t)h(implemen)m(tation.)470
+ 1489 y(Chec)m(k)m(er's)i(analysis)e(passes)g(also)f(su\013er)g(from)f
+ (other,)h(smaller,)h(de\014ciencies:)443 1685 y(1.)49
+ b(The)44 b(v)-5 b(alidit)m(y)44 b(pass)g(is)g(unable)f(to)g(detect)h
+ (an)g(out)f(of)f(b)s(ounds)i(access)h(to)e(an)568 1805
+ y(arra)m(y)-8 b(,)38 b(ev)m(en)g(if)f(the)g(b)s(ounds)h(and)f(index)h
+ (are)f(b)s(oth)g(kno)m(wn)h(at)f(compile)h(time.)568
+ 1925 y(Curren)m(tly)-8 b(,)31 b(an)m(y)f(v)-5 b(alue)29
+ b(tak)m(en)h(from)f(a)g(memory)h(load)e(is)i(assumed)h(to)d(b)s(e)h(v)
+ -5 b(alid,)568 2046 y(ev)m(en)34 b(if)e(there)i(is)f(no)f(matc)m(hing)i
+ (store)f(at)f(all!)568 2206 y(The)h(prop)s(er)g(w)m(a)m(y)h(to)e(\014x)
+ i(this)f(is)g(to)g(exp)s(ose)h(the)f(p)s(oin)m(ter)g(analysis)h(to)f
+ (LL)-11 b(VMs)568 2327 y(optimizers)27 b(through)g(the)f(pro)m(vided)i
+ (AliasAnalysis)h(in)m(terface,)f(so)f(that)f(LL)-11 b(VM)568
+ 2447 y(can)33 b(\014nd)g(suc)m(h)h(cases)g(and)e(substitute)j(them)e
+ (for)f Fg(undef)p Fi(.)443 2648 y(2.)49 b(Due)38 b(to)h(its)g
+ (optimization-cen)m(tric)h(design,)i(LL)-11 b(VM)39 b(naturally)g(remo)
+ m(v)m(es)i(par-)568 2768 y(tially)33 b(unde\014ned)h(v)-5
+ b(alues.)44 b(F)-8 b(or)32 b(example:)568 3026 y Fg(int)52
+ b(f\(\))g({)670 3146 y(int)g(x;)670 3266 y(x)g(|=)g(1;)670
+ 3387 y(return)h(x;)568 3507 y(})568 3765 y Fi(is)33 b(optimized)h(in)m
+ (to:)568 4022 y Fg(int)52 b(\045f\(\))g({)568 4143 y(entry:)978
+ 4263 y(ret)g(int)g(-1)568 4383 y(})568 4641 y Fi(While)c(this)g
+ (substitution)h(is)e(alw)m(a)m(ys)i(v)-5 b(alid)48 b(for)f(an)g
+ (optimizer,)52 b(it)47 b(replaces)568 4761 y(unde\014ned)c(b)s(eha)m
+ (viour)g(with)f(de\014ned)h(b)s(eha)m(viour,)i(circum)m(v)m(en)m(ting)f
+ (c)m(hec)m(k)m(er's)568 4882 y(abilit)m(y)c(to)g(detect)g(the)g
+ (non-determinism)i(in)e(the)g(original)f(co)s(de.)65
+ b(Ho)m(w)m(ev)m(er,)568 5002 y(LL)-11 b(VM)36 b(will)g(generate)g(co)s
+ (de)g(based)g(on)g(the)f(optimized)i(v)m(ersion,)h(and)e(so,)g(the)1894
+ 5251 y(15)p eop end
+ %%Page: 16 16
+ TeXDict begin 16 15 bop 568 548 a Fi(resulting)25 b(program)f(will)h
+ (not)g(b)s(e)f(non-deterministic.)43 b(In)25 b(this)g(sense,)j(c)m(hec)
+ m(k)m(er's)568 668 y(failure)22 b(to)g(w)m(arn)h(ab)s(out)f(this)g
+ (error)h(could)f(b)s(e)h(considered)h(correct,)h(as)d(it)g(is)h(op)s
+ (er-)568 789 y(ating)k(on)g(the)g(compiler's)i(in)m(terpretation)f(of)f
+ (the)h(program,)g(not)f(the)h(language)568 909 y(standard's)43
+ b(in)m(terpretation.)74 b(Nev)m(ertheless,)48 b(LL)-11
+ b(VM)43 b(could)f(b)s(e)h(mo)s(di\014ed)g(to)568 1029
+ y(c)m(hange)33 b(its)g(treatmen)m(t)h(of)39 b Fg(undef)p
+ Fi(.)443 1233 y(3.)49 b(The)44 b(p)s(oin)m(ter)h(analysis)g(is)f
+ (region-based,)j(and)d(unable)g(to)g(di\013eren)m(tiate)h(b)s(e-)568
+ 1353 y(t)m(w)m(een)34 b(accesses)h(of)d(di\013eren)m(t)i(\014elds)g(in)
+ f(an)f(arra)m(y)h(or)f(structure.)443 1557 y(4.)49 b(The)36
+ b(p)s(oin)m(ter)g(analysis)h(could)g(b)s(e)f(made)g(less)h(conserv)-5
+ b(ativ)m(e)38 b(in)e(step)g(three)h(b)m(y)568 1677 y(eliminating)48
+ b(store)g(instructions)i(that)d(are)h(iden)m(tical)h(in)f(all)f(branc)m
+ (hes)i(and)568 1797 y(guaran)m(teed)29 b(to)g(execute.)44
+ b(This)30 b(is)f(made)h(sligh)m(tly)g(more)f(di\016cult)h(b)s(ecause)g
+ (the)568 1918 y(order)g(of)f(m)m(ultiple)j(store)e(instructions)i
+ (storing)e(to)g(the)g(same)h(region)f(needs)i(to)568
+ 2038 y(b)s(e)g(compared.)443 2242 y(5.)49 b(Region-based)g(analysis)h
+ (could)f(b)s(ecome)h(a)e(more)h(\014ne-grained)g(\014eld-based)568
+ 2362 y(analysis.)470 2565 y(Ev)m(en)41 b(the)e(b)s(est)g(analysis)i
+ (pro)s(cess)f(is)f(limited)h(b)m(y)g(its)f(in)m(terface)h(with)f(the)h
+ (user.)324 2686 y(One)f(w)m(a)m(y)h(to)e(impro)m(v)m(e)j(c)m(hec)m(k)m
+ (er)h(is)d(to)f(mak)m(e)i(it)f(in)m(teractiv)m(e,)k(allo)m(wing)c(the)g
+ (user)h(to)324 2806 y(see)49 b(what)f(the)h(aliasing)f(set)h(of)e(a)h
+ (v)-5 b(ariable)48 b(is)h(at)e(a)h(particular)g(p)s(oin)m(t.)90
+ b(A)48 b(more)324 2927 y(adv)-5 b(anced)31 b(v)m(ersion)h(of)e(the)h
+ (same)h(w)m(ould)f(emplo)m(y)h(LL)-11 b(VMs)31 b(JITter)h(to)e(allo)m
+ (w)h(a)f(mixed)324 3047 y(static/dynamic)41 b(analysis)g(where)g(the)f
+ (user)h(could)f(en)m(ter)h(v)-5 b(alues)41 b(for)e(the)h(registers)324
+ 3167 y(and)32 b(execute)j(for)d(a)g(few)h(instructions)i(to)d(test)h(a)
+ f(h)m(yp)s(othesis.)470 3288 y(Finally)-8 b(,)36 b(c)m(hec)m(k)m(er)j
+ (needs)e(to)e(b)s(e)g(able)h(to)f(prune)h(p)s(oin)m(ters)g(from)f(the)h
+ (aliasing)g(set)324 3408 y(when)d(a)g(conditional)g(is)g(encoun)m
+ (tered.)324 3741 y Fk(6)161 b(Conclusion)324 3960 y Fi(Finding)27
+ b(simple)h(common)f(errors)g(pro)m(v)m(es)h(p)s(ossible)g(with)f
+ (relativ)m(ely)i(little)e(w)m(ork.)42 b(W)-8 b(e)324
+ 4080 y(ha)m(v)m(e)30 b(found)g(that)f(c)m(hec)m(k)m(er)j(can)d(detect)h
+ (co)s(ding)g(errors)f(and)h(o\013ers)f(opp)s(ortunities)h(for)324
+ 4201 y(further)45 b(extension,)k(but)c(is)g(not)g(y)m(et)g(capable)h
+ (of)e(prop)s(erly)h(analyzing)g(real-w)m(orld)324 4321
+ y(soft)m(w)m(are.)324 4654 y Fk(References)324 4873 y
+ Fi([ALB)554 4837 y Fe(+)613 4873 y Fi(03])71 b(Vikram)37
+ b(Adv)m(e,)i(Chris)e(Lattner,)g(Mic)m(hael)h(Brukman,)h(Anand)d(Sh)m
+ (ukla,)809 4993 y(and)47 b(Brian)g(Gaek)m(e.)86 b(LL)-11
+ b(V)g(A:)48 b(A)f(Lo)m(w-lev)m(el)h(Virtual)f(Instruction)h(Set)1894
+ 5251 y(16)p eop end
+ %%Page: 17 17
+ TeXDict begin 17 16 bop 809 548 a Fi(Arc)m(hitecture.)54
+ b(In)36 b Fa(Pr)-5 b(o)g(c)g(e)g(e)g(dings)36 b(of)h(the)h(36th)f
+ (annual)g(A)n(CM/IEEE)g(in-)809 668 y(ternational)48
+ b(symp)-5 b(osium)49 b(on)f(Micr)-5 b(o)g(ar)g(chite)g(ctur)g(e)49
+ b(\(MICR)n(O-36\))p Fi(,)h(San)809 789 y(Diego,)32 b(California,)g(Dec)
+ h(2003.)809 909 y(h)m(ttp://llvm.org/pubs/2003-10-01-LL)-11
+ b(V)g(A.h)m(tml)324 1110 y([And94])152 b(Lars)23 b(Ole)h(Andersen.)30
+ b Fa(Pr)-5 b(o)g(gr)g(am)26 b(A)n(nalysis)g(and)g(Sp)-5
+ b(e)g(cialization)24 b(for)i(the)h(C)809 1230 y(Pr)-5
+ b(o)g(gr)g(amming)27 b(L)-5 b(anguage)p Fi(.)32 b(PhD)26
+ b(thesis,)j(DIKU,)d(Univ)m(ersit)m(y)j(of)c(Cop)s(en-)809
+ 1350 y(hagen,)33 b(Ma)m(y)g(1994.)809 1471 y(h)m(ttp://rep)s(ository)-8
+ b(.readsc)m(heme.org/ftp/pap)s(ers/topps/D-203.p)s(df)324
+ 1672 y([BLQ)557 1635 y Fe(+)616 1672 y Fi(03])68 b(Marc)42
+ b(Berndl,)j(Ond)-5 b(\024)-43 b(rej)41 b(Lhot\023)-49
+ b(ak,)45 b(F)-8 b(eng)41 b(Qian,)k(Laurie)d(Hendren,)j(and)809
+ 1792 y(Na)m(vindra)32 b(Umanee.)42 b(P)m(oin)m(ts-to)32
+ b(analysis)h(using)f(b)s(dds.)42 b(In)32 b Fa(Pr)-5 b(o)g(c)g(e)g(e)g
+ (dings)809 1912 y(of)42 b(the)h(A)n(CM)g(SIGPLAN)h(2003)e(Confer)-5
+ b(enc)g(e)42 b(on)g(Pr)-5 b(o)g(gr)g(amming)42 b(L)-5
+ b(an-)809 2033 y(guage)46 b(Design)f(and)h(Inplementation)p
+ Fi(,)g(pages)g(103{114.)e(A)m(CM)i(Press,)809 2153 y(2003.)324
+ 2354 y([DKA05])109 b(Dinak)-5 b(ar)35 b(Dh)m(urjati,)i(Suman)m(t)g(Ko)m
+ (wshik,)h(and)f(Vikram)f(Adv)m(e.)56 b(Enforc-)809 2474
+ y(ing)38 b(Alias)g(Analysis)h(for)f(W)-8 b(eakly)39 b(T)m(yp)s(ed)g
+ (Languages.)59 b(T)-8 b(ec)m(hnical)40 b(Re-)809 2594
+ y(p)s(ort)i(#UIUCDCS-R-2005-2657,)h(Computer)h(Science)g(Dept.,)i
+ (Univ.)809 2715 y(of)32 b(Illinois,)h(No)m(v)h(2005.)809
+ 2835 y(h)m(ttp://llvm.org/pubs/2005-11-SAFECo)s(deTR.h)m(tml)324
+ 3036 y([DKAL05])48 b(Dinak)-5 b(ar)48 b(Dh)m(urjati,)53
+ b(Suman)m(t)d(Ko)m(wshik,)55 b(Vikram)50 b(Adv)m(e,)55
+ b(and)49 b(Chris)809 3156 y(Lattner.)35 b(Memory)28 b(safet)m(y)h
+ (without)e(garbage)g(collection)i(for)e(em)m(b)s(edded)809
+ 3277 y(applications.)54 b Fa(T)-7 b(r)i(ans.)36 b(on)i(Emb)-5
+ b(e)g(dde)g(d)37 b(Computing)g(Sys.)p Fi(,)f(4\(1\):73{111,)809
+ 3397 y(2005.)809 3517 y(h)m(ttp://llvm.org/pubs/2005-02-TECS-SAFECo)s
+ (de.h)m(tml)324 3718 y([ECCH00])54 b(Da)m(wson)37 b(Engler,)h(Benjamin)
+ f(Chelf,)h(Andy)f(Chou,)h(and)f(Seth)g(Hallem.)809 3838
+ y(Chec)m(king)65 b(System)h(Rules)e(Using)h(System-Sp)s(eci\014c,)74
+ b(Programmer-)809 3959 y(W)-8 b(ritten)32 b(Compiler)h(Extensions.)44
+ b Fa(4th)34 b(Symp)-5 b(osium)33 b(on)h(Op)-5 b(er)g(ating)33
+ b(Sys-)809 4079 y(tems)h(Design)g(&)h(Implementation)p
+ Fi(,)30 b(2000.)809 4200 y(h)m(ttp://www.stanford.edu/)35
+ b(engler/mc-osdi.ps)324 4400 y([LA04a])150 b(Chris)34
+ b(Lattner)g(and)g(Vikram)g(Adv)m(e.)48 b(LL)-11 b(VM:)34
+ b(A)g(Compilation)g(F)-8 b(rame-)809 4521 y(w)m(ork)39
+ b(for)e(Lifelong)h(Program)g(Analysis)i(&)e(T)-8 b(ransformation.)60
+ b(In)39 b Fa(Pr)-5 b(o-)809 4641 y(c)g(e)g(e)g(dings)44
+ b(of)h(the)g(2004)g(International)f(Symp)-5 b(osium)45
+ b(on)g(Co)-5 b(de)45 b(Gener-)809 4761 y(ation)j(and)g(Optimization)g
+ (\(CGO'04\))p Fi(,)i(P)m(alo)e(Alto,)j(California,)h(Mar)809
+ 4882 y(2004.)809 5002 y(h)m(ttp://llvm.org/pubs/2004-01-30-CGO-LL)-11
+ b(VM.h)m(tml)1894 5251 y(17)p eop end
+ %%Page: 18 18
+ TeXDict begin 18 17 bop 324 548 a Fi([LA04b])145 b(Chris)41
+ b(Lattner)g(and)f(Vikram)h(Adv)m(e.)68 b(The)42 b(LL)-11
+ b(VM)41 b(Compiler)g(F)-8 b(rame-)809 668 y(w)m(ork)42
+ b(and)f(Infrastructure)h(T)-8 b(utorial.)69 b(In)41 b
+ Fa(LCPC'04)h(Mini)g(Workshop)809 789 y(on)f(Compiler)g(R)-5
+ b(ese)g(ar)g(ch)41 b(Infr)-5 b(astructur)g(es)p Fi(,)43
+ b(W)-8 b(est)41 b(Lafa)m(y)m(ette,)i(Indiana,)809 909
+ y(Sep)33 b(2004.)809 1029 y(h)m(ttp://llvm.org/pubs/2004-09-22-LCPCLL)
+ -11 b(VMT)j(utorial.h)m(tml)324 1233 y([Lat06])185 b(Chris)49
+ b(Lattner.)91 b(LL)-11 b(VM)49 b(Assem)m(bly)j(Language)c(Reference)i
+ (Man)m(ual,)809 1353 y(Ma)m(y)33 b(2006.)809 1474 y(h)m
+ (ttp://llvm.org/do)s(cs/LangRef.h)m(tml)324 1677 y([SN])304
+ b(Julian)45 b(Sew)m(ard)h(and)f(Nic)m(k)h(Nethercote.)80
+ b(V)-8 b(algrind,)48 b(an)d(op)s(en-source)809 1797 y(memory)33
+ b(debugger)h(for)e(x86-GNU/Lin)m(ux.)809 1918 y(h)m(ttp://www.v)-5
+ b(algrind.org/)1894 5251 y(18)p eop end
+ %%Trailer
+
+ userdict /end-hook known{end-hook}if
+ %%EOF
From lattner at cs.uiuc.edu Mon Jun 12 15:34:54 2006
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon, 12 Jun 2006 15:34:54 -0500
Subject: [llvm-commits] CVS: llvm-www/pubs/index.html
Message-ID: <200606122034.PAA01258@zion.cs.uiuc.edu>
Changes in directory llvm-www/pubs:
index.html updated: 1.38 -> 1.39
---
Log message:
Add a new pub
---
Diffs of the changes: (+3 -0)
index.html | 3 +++
1 files changed, 3 insertions(+)
Index: llvm-www/pubs/index.html
diff -u llvm-www/pubs/index.html:1.38 llvm-www/pubs/index.html:1.39
--- llvm-www/pubs/index.html:1.38 Fri Apr 28 12:16:22 2006
+++ llvm-www/pubs/index.html Mon Jun 12 15:34:42 2006
@@ -38,6 +38,9 @@
+"Checker: a Static Program Checker "
+Nicholas Lewycky. B.Sc. Thesis , Computer Science Dept., Ryerson University, June 2006.
+
"Vector LLVA: A Virtual Vector Instruction Set for Media Processing " Robert L. Bocchino Jr. and Vikram S. Adve.
Proc. of the Second International Conference on Virtual Execution Environments (VEE'06) , Ottawa, Canada, 2006.
From resistor at mac.com Mon Jun 12 16:49:33 2006
From: resistor at mac.com (Owen Anderson)
Date: Mon, 12 Jun 2006 16:49:33 -0500
Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
Message-ID: <200606122149.QAA30269@zion.cs.uiuc.edu>
Changes in directory llvm/lib/Transforms/Scalar:
LoopUnswitch.cpp updated: 1.38 -> 1.39
---
Log message:
Reapply my 6/9 changes. The bug Evan saw no longer occurs.
---
Diffs of the changes: (+7 -1)
LoopUnswitch.cpp | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletion(-)
Index: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
diff -u llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.38 llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.39
--- llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.38 Sun Jun 11 04:32:57 2006
+++ llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Mon Jun 12 16:49:21 2006
@@ -73,6 +73,8 @@
AU.addPreservedID(LoopSimplifyID);
AU.addRequired();
AU.addPreserved();
+ AU.addRequiredID(LCSSAID);
+ AU.addPreservedID(LCSSAID);
}
private:
@@ -154,6 +156,8 @@
}
bool LoopUnswitch::visitLoop(Loop *L) {
+ assert(L->isLCSSAForm());
+
bool Changed = false;
// Loop over all of the basic blocks in the loop. If we find an interior
@@ -198,7 +202,9 @@
}
}
}
-
+
+ assert(L->isLCSSAForm());
+
return Changed;
}
From lattner at cs.uiuc.edu Mon Jun 12 16:51:09 2006
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon, 12 Jun 2006 16:51:09 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
Message-ID: <200606122151.QAA30351@zion.cs.uiuc.edu>
Changes in directory llvm/lib/Target/PowerPC:
PPCRegisterInfo.cpp updated: 1.67 -> 1.68
---
Log message:
Fix spilling and reloading of CR regs to reload the right values. This fixes
Olden/power (and probably others) with -regalloc=local.
---
Diffs of the changes: (+24 -2)
PPCRegisterInfo.cpp | 26 ++++++++++++++++++++++++--
1 files changed, 24 insertions(+), 2 deletions(-)
Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.67 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.68
--- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.67 Wed May 17 19:12:25 2006
+++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Mon Jun 12 16:50:57 2006
@@ -102,7 +102,19 @@
BuildMI(MBB, MI, PPC::MFLR, 1, PPC::R11);
addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(PPC::R11), FrameIdx);
} else if (RC == PPC::CRRCRegisterClass) {
+ // We need to store the CR in the low 4-bits of the saved value. First,
+ // issue a MFCR to save all of the CRBits.
BuildMI(MBB, MI, PPC::MFCR, 0, PPC::R11);
+
+ // If the saved register wasn't CR0, shift the bits left so that they are in
+ // CR0's slot.
+ if (SrcReg != PPC::CR0) {
+ unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(SrcReg)*4;
+ // rlwinm r11, r11, ShiftBits, 0, 31.
+ BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R11)
+ .addReg(PPC::R11).addImm(ShiftBits).addImm(0).addImm(31);
+ }
+
addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(PPC::R11), FrameIdx);
} else if (RC == PPC::GPRCRegisterClass) {
addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(SrcReg),FrameIdx);
@@ -137,6 +149,16 @@
BuildMI(MBB, MI, PPC::MTLR, 1).addReg(PPC::R11);
} else if (RC == PPC::CRRCRegisterClass) {
addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, PPC::R11), FrameIdx);
+
+ // If the reloaded register isn't CR0, shift the bits right so that they are
+ // in the right CR's slot.
+ if (DestReg != PPC::CR0) {
+ unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(DestReg)*4;
+ // rlwinm r11, r11, 32-ShiftBits, 0, 31.
+ BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R11)
+ .addReg(PPC::R11).addImm(32-ShiftBits).addImm(0).addImm(31);
+ }
+
BuildMI(MBB, MI, PPC::MTCRF, 1, DestReg).addReg(PPC::R11);
} else if (RC == PPC::GPRCRegisterClass) {
addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, DestReg), FrameIdx);
@@ -407,8 +429,8 @@
/// VRRegNo - Map from a numbered VR register to its enum value.
///
static const unsigned short VRRegNo[] = {
- PPC::V0 , PPC::V1 , PPC::V2 , PPC::V3 , PPC::V4 , PPC::V5 , PPC::V6 , PPC::V7 ,
- PPC::V8 , PPC::V9 , PPC::V10, PPC::V11, PPC::V12, PPC::V13, PPC::V14, PPC::V15,
+ PPC::V0 , PPC::V1 , PPC::V2 , PPC::V3 , PPC::V4 , PPC::V5 , PPC::V6 , PPC::V7 ,
+ PPC::V8 , PPC::V9 , PPC::V10, PPC::V11, PPC::V12, PPC::V13, PPC::V14, PPC::V15,
PPC::V16, PPC::V17, PPC::V18, PPC::V19, PPC::V20, PPC::V21, PPC::V22, PPC::V23,
PPC::V24, PPC::V25, PPC::V26, PPC::V27, PPC::V28, PPC::V29, PPC::V30, PPC::V31
};
From lattner at cs.uiuc.edu Mon Jun 12 18:59:28 2006
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon, 12 Jun 2006 18:59:28 -0500
Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
Message-ID: <200606122359.SAA31119@zion.cs.uiuc.edu>
Changes in directory llvm/lib/Target/PowerPC:
PPCRegisterInfo.cpp updated: 1.68 -> 1.69
---
Log message:
Gaar! Don't use r11 for CR save/restore, use R0. R11 can be register
allocated, thus live across the save/reload. This fixes
llc-beta /MultiSource/Applications/spiff/spiff
llc-beta /MultiSource/Benchmarks/sim/sim:
llc-beta /MultiSource/Benchmarks/Ptrdist/bc/bc
llc-beta /MultiSource/Benchmarks/McCat/12-IOtest/iotest:
llc-beta /MultiSource/Benchmarks/FreeBench/fourinarow/fourinarow
llc-beta /MultiSource/Benchmarks/Fhourstones-3.1/fhourstones3.1
llc-beta /MultiSource/Benchmarks/mediabench/adpcm/rawdaudio/rawdaudio
llc-beta /MultiSource/Benchmarks/mediabench/adpcm/rawcaudio/rawcaudio
llc-beta /MultiSource/Benchmarks/mediabench/g721/g721encode/encode
llc-beta /MultiSource/Benchmarks/mediabench/jpeg/jpeg-6a/cjpeg
and probably others, with -regalloc=local.
---
Diffs of the changes: (+11 -9)
PPCRegisterInfo.cpp | 20 +++++++++++---------
1 files changed, 11 insertions(+), 9 deletions(-)
Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.68 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.69
--- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.68 Mon Jun 12 16:50:57 2006
+++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Mon Jun 12 18:59:16 2006
@@ -102,20 +102,21 @@
BuildMI(MBB, MI, PPC::MFLR, 1, PPC::R11);
addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(PPC::R11), FrameIdx);
} else if (RC == PPC::CRRCRegisterClass) {
+ // FIXME: We use R0 here, because it isn't available for RA.
// We need to store the CR in the low 4-bits of the saved value. First,
// issue a MFCR to save all of the CRBits.
- BuildMI(MBB, MI, PPC::MFCR, 0, PPC::R11);
+ BuildMI(MBB, MI, PPC::MFCR, 0, PPC::R0);
// If the saved register wasn't CR0, shift the bits left so that they are in
// CR0's slot.
if (SrcReg != PPC::CR0) {
unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(SrcReg)*4;
- // rlwinm r11, r11, ShiftBits, 0, 31.
- BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R11)
- .addReg(PPC::R11).addImm(ShiftBits).addImm(0).addImm(31);
+ // rlwinm r0, r0, ShiftBits, 0, 31.
+ BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R0)
+ .addReg(PPC::R0).addImm(ShiftBits).addImm(0).addImm(31);
}
- addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(PPC::R11), FrameIdx);
+ addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(PPC::R0), FrameIdx);
} else if (RC == PPC::GPRCRegisterClass) {
addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(SrcReg),FrameIdx);
} else if (RC == PPC::G8RCRegisterClass) {
@@ -148,18 +149,19 @@
addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, PPC::R11), FrameIdx);
BuildMI(MBB, MI, PPC::MTLR, 1).addReg(PPC::R11);
} else if (RC == PPC::CRRCRegisterClass) {
- addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, PPC::R11), FrameIdx);
+ // FIXME: We use R0 here, because it isn't available for RA.
+ addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, PPC::R0), FrameIdx);
// If the reloaded register isn't CR0, shift the bits right so that they are
// in the right CR's slot.
if (DestReg != PPC::CR0) {
unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(DestReg)*4;
// rlwinm r11, r11, 32-ShiftBits, 0, 31.
- BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R11)
- .addReg(PPC::R11).addImm(32-ShiftBits).addImm(0).addImm(31);
+ BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R0)
+ .addReg(PPC::R0).addImm(32-ShiftBits).addImm(0).addImm(31);
}
- BuildMI(MBB, MI, PPC::MTCRF, 1, DestReg).addReg(PPC::R11);
+ BuildMI(MBB, MI, PPC::MTCRF, 1, DestReg).addReg(PPC::R0);
} else if (RC == PPC::GPRCRegisterClass) {
addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, DestReg), FrameIdx);
} else if (RC == PPC::G8RCRegisterClass) {
From lattner at cs.uiuc.edu Mon Jun 12 22:05:59 2006
From: lattner at cs.uiuc.edu (Chris Lattner)
Date: Mon, 12 Jun 2006 22:05:59 -0500
Subject: [llvm-commits] CVS: llvm/docs/LangRef.html
Message-ID: <200606130305.WAA32096@zion.cs.uiuc.edu>
Changes in directory llvm/docs:
LangRef.html updated: 1.153 -> 1.154
---
Log message:
Decribe the "implementation" keyword.
---
Diffs of the changes: (+11 -1)
LangRef.html | 12 +++++++++++-
1 files changed, 11 insertions(+), 1 deletion(-)
Index: llvm/docs/LangRef.html
diff -u llvm/docs/LangRef.html:1.153 llvm/docs/LangRef.html:1.154
--- llvm/docs/LangRef.html:1.153 Fri May 19 16:15:36 2006
+++ llvm/docs/LangRef.html Mon Jun 12 22:05:47 2006
@@ -350,6 +350,9 @@
; External declaration of the puts function
declare int %puts(sbyte*) ; int(sbyte*)*
+; Global variable / Function body section separator
+implementation
+
; Definition of main function
int %main() { ; int()*
; Convert [13x sbyte]* to sbyte *...
@@ -373,6 +376,13 @@
array of char, and a pointer to a function), and have one of the following linkage types .
+Due to a limitation in the current LLVM assembly parser (it is limited by
+one-token lookahead), modules are split into two pieces by the "implementation"
+keyword. Global variable prototypes and definitions must occur before the
+keyword, and function definitions must occur after it. Function prototypes may
+occur either before or after it. In the future, the implementation keyword may
+become a noop, if the parser gets smarter.
+
@@ -3830,7 +3840,7 @@
Chris Lattner
The LLVM Compiler Infrastructure
- Last modified: $Date: 2006/05/19 21:15:36 $
+ Last modified: $Date: 2006/06/13 03:05:47 $